{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 一、Pytorch的建模流程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用Pytorch实现神经网络模型的一般流程包括：\n",
    "\n",
    "1，准备数据\n",
    "\n",
    "2，定义模型\n",
    "\n",
    "3，训练模型\n",
    "\n",
    "4，评估模型\n",
    "\n",
    "5，使用模型\n",
    "\n",
    "6，保存模型。\n",
    "\n",
    "\n",
    "**对新手来说，其中最困难的部分实际上是准备数据过程。** \n",
    "\n",
    "我们在实践中通常会遇到的数据类型包括结构化数据，图片数据，文本数据，时间序列数据。\n",
    "\n",
    "我们将分别以titanic生存预测问题，cifar2图片分类问题，imdb电影评论分类问题，国内新冠疫情结束时间预测问题为例，演示应用Pytorch对这四类数据的建模方法。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1-1 结构化数据建模流程范例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import datetime\n",
    "\n",
    "#打印时间\n",
    "def printbar():\n",
    "    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "    print(\"\\n\"+\"==========\"*8 + \"%s\"%nowtime)\n",
    "\n",
    "#mac系统上pytorch和matplotlib在jupyter中同时跑需要更改环境变量\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\" "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一，准备数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "titanic数据集的目标是根据乘客信息预测他们在Titanic号撞击冰山沉没后能否生存。\n",
    "\n",
    "结构化数据一般会使用Pandas中的DataFrame进行预处理。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'torch'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-2-287b13b6c953>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnn\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mtorch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mDataset\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mDataLoader\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mTensorDataset\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'torch'"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt\n",
    "import torch \n",
    "from torch import nn \n",
    "from torch.utils.data import Dataset,DataLoader,TensorDataset\n",
    "\n",
    "dftrain_raw = pd.read_csv('./data/titanic/train.csv')\n",
    "dftest_raw = pd.read_csv('./data/titanic/test.csv')\n",
    "dftrain_raw.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "字段说明：\n",
    "\n",
    "* Survived:0代表死亡，1代表存活【y标签】\n",
    "* Pclass:乘客所持票类，有三种值(1,2,3) 【转换成onehot编码】\n",
    "* Name:乘客姓名 【舍去】\n",
    "* Sex:乘客性别 【转换成bool特征】\n",
    "* Age:乘客年龄(有缺失) 【数值特征，添加“年龄是否缺失”作为辅助特征】\n",
    "* SibSp:乘客兄弟姐妹/配偶的个数(整数值) 【数值特征】\n",
    "* Parch:乘客父母/孩子的个数(整数值)【数值特征】\n",
    "* Ticket:票号(字符串)【舍去】\n",
    "* Fare:乘客所持票的价格(浮点数，0-500不等) 【数值特征】\n",
    "* Cabin:乘客所在船舱(有缺失) 【添加“所在船舱是否缺失”作为辅助特征】\n",
    "* Embarked:乘客登船港口:S、C、Q(有缺失)【转换成onehot编码，四维度 S,C,Q,nan】\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用Pandas的数据可视化功能我们可以简单地进行探索性数据分析EDA（Exploratory Data Analysis）。\n",
    "\n",
    "label分布情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuIAAAHqCAYAAABBWCvPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAeFklEQVR4nO3dfbSudV3n8c+3QyQQT/IQ2aBHtBWis8YmxspykU+D0BiTE7FmapVjLRdTahP2oC5ZCzETSHEa0JBssnkwRKUMlRDwKdMaD5o1IuYqCZURQQ+DcFCJvvPHde+8190+D/ucffZv783rtdZe59y/63ff92/zB+t9rvW7rqu6OwAAwNr6ptELAACAByMhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMMABoxcwytFHH91bt24dvQwAADaxG2+88c7uPma5Yw/aEN+6dWu2bds2ehkAAGxiVfV3OztmawoAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADHDB6AWx8W1/0ztFLgJ265YIfHr0EAFiWM+IAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGGBriVfUdVXVPVXVVfevceFXVS6rqs1V1X1V9oKoev8z7T6qqG6pqR1XdVlXnV9WWNf0lAABgL4w+I/4bSe5ZZvxFSc5NcmGSZ87mXF9Vxy1NqKojk1yfpJOckeT8JC9M8rL9vGYAANhnw0K8qp6U5BlJXrUw/pBMIf7K7r60u69Pcmam4H7e3NSzkxyU5FndfV13X5Ypws+pqsPW4ncAAIC9NSTEZ9tHLsl0FvvOhcNPTHJYkiuXBrr73iRXJzltbt5pSa7t7rvnxq7IFOen7IdlAwDAqhl1RvzsJA9J8tpljp2Y5IEkn14Y/+Ts2Py8m+cndPetSXYszAMAgHXngLX+wqo6KsnLk/xkd99fVYtTjkxyT3c/sDC+PcnBVXVgd399Nu+uZb5i++wYAACsWyPOiL8iyZ9397t2MaeXGatlju1s3nLjqarnVtW2qtp2xx137NFiAQBgf1jTEK+qxyZ5TpKXVdURVXVEkoNnhw+vqoMyndE+dJnbEB6RZEd33z97vX02tujwLH+mPN19eXef3N0nH3PMMfvyqwAAwD5Z660p35nkm5N8eJljn0vyO0nelGRLkkcn+dTc8cU94TdnYS94VR2f5JCFeQAAsO6sdYh/MMmTF8aekeRXk5ye5G+T/F2SuzPdsvDXkqSqDs50P/HL5953TZJfrqpDu/srs7GzktyX5P376xcAAIDVsKYh3t13Jnnf/FhVbZ399U+6+57Z2AVJzq2q7ZnObp+TaRvNJXNvvSzJC5JcVVUXJjkhyXlJLl64pSEAAKw7a37XlD10QabwfnGSo5JsS/L07r59aUJ3b6+qpya5NNM9xu9K8ppMMQ4AAOva8BDv7jcmeePCWGe6u8ordvPem5I8ZX+tDQAA9pdhj7gHAIAHMyEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYYE1DvKp+rKo+VFVfqqqvVtWnquqlVXXg3JyqqpdU1Wer6r6q+kBVPX6Zzzqpqm6oqh1VdVtVnV9VW9by9wEAgL11wBp/31FJ3pvkN5LcleQJSc5LclyS583mvCjJuUl+OcnNSc5Jcn1VPa67v5AkVXVkkuuT3JTkjCSPSvLqTP+weOna/CoAALD31jTEu/v1C0PvrarDkvx8VT0/ybdkCvFXdvelSVJVH05yS6ZQX4rss5MclORZ3X13kutmn3NeVV00GwMAgHVrPewR/1KSpa0pT0xyWJIrlw52971Jrk5y2tx7Tkty7UJwX5Epzk/Zr6sFAIBVMCTEq2pLVR1cVT+Y5AVJfqu7O8mJSR5I8umFt3xydmzJiZm2rfyj7r41yY6FeQAAsC6t9R7xJfdm2oaSJP89037wJDkyyT3d/cDC/O1JDq6qA7v767N5dy3zudtnxwAAYF0btTXliUmelOSFmS62vHTuWC8zv5Y5trN5y41PB6ueW1XbqmrbHXfcsbIVAwDAKhpyRry7Pzr76wer6s4kv1dVr850RvvQqtqycFb8iCQ7uvv+2evts7FFh2f5M+VL33t5ksuT5OSTT95psAMAwP62Hi7WXIryR2ba970lyaMX5izuCb85C3vBq+r4JIcszAMAgHVpPYT4D8z+/EySDyW5O8mZSwer6uAkz0xyzdx7rklyalUdOjd2VpL7krx/v64WAABWwZpuTamqP870IJ5PZLo7yg9k2if+5u7+m9mcC5KcW1Xb840H+nxTkkvmPuqyTHdbuaqqLkxyQqYHA13sHuIAAGwEa71H/CNJnp1ka5K/T/K3SV6cKayXXJApvF+c6Umc25I8vbtvX5rQ3dur6qmZLvK8OtO+8NdkinEAAFj31vrJmudmenz9ruZ0klfMfnY176YkT1m91QEAwNpZD3vEAQDgQUeIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABDhi9AAB4MNr6oneOXgLs1C0X/PDoJTwoOCMOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAAD7HGIV9WTquqMuddHV9WbquovqurVVfXN+2eJAACw+azkjPhFSR439/o3kzw1yZ8leXaSl63esgAAYHNbSYh/V5Ibk6SqDk7yo0l+obvPTvIrSc5a/eUBAMDmtJIQPzDJV2d//4EkByR55+z1Xyf59lVcFwAAbGorCfGbkzxj9vefSPLh7v7K7PXDknx5NRcGAACb2QErmHt+krdU1c8kOTzJGXPHnpHkY6u5MAAA2Mz2OMS7+4+q6jFJvjvJX3X3X88d/nCSj6/24gAAYLNaye0LfyrJ/+vuty1EeJK8NdPFnAAAwB5YyR7x303yqJ0ce+TsOAAAsAdWEuK1i2NHJbl7H9cCAAAPGrvcIz57kub8RZnnVtUdC9MekuRJST6yymsDAIBNa3cXax6b5J/PvX5UkuMW5nw9ybuT/NoqrgsAADa1XYZ4d/92kt9Okqp6b5L/1N03r8XCAABgM1vJ7QufvD8XAgAADyYreaBPquphSf5Nkn+WaW/4vO7uX12thQEAwGa2xyFeVT+a5PeTbEnyxUx7w+d1EiEOAAB7YCVnxH8900WZz+7uL++n9QAAwIPCSkL8+CTPF+EAALDvVvJAnw/FY+wBAGBVrOSM+DlJ/ldV3ZPkuiR3LU7o7h2rtC4AANjUVhLifzn783czXZi5nC37thwAAHhwWEmIPyc7D3AAAGAFVvJAnzfux3UAAMCDykou1gQAAFbJSh7oc0d2szWlu4/d5xUBAMCDwEr2iL82/zTEH5rkKUkOS/I7q7UoAADY7FayR/y85carqpJcmeTvV2lNAACw6e3zHvHu7iRvSPK8fV8OAAA8OKzWxZonJDlwlT4LAAA2vZVcrPlzywwfmOQxSX4iyVtWa1EAALDZreRizUuXGftaks8leV2Sl63KigAA4EFgJRdruuc4AACsEnENAAADrCjEq+qEqvqtqvqrqvr87M/XVdUJ+2uBAACwGa3kYs3vSfLeJF9N8o4ktyf5tiT/LslPVNWTu/uj+2WVAACwyazkYs1XJflYktO6e8fSYFUdnORds+NPWd3lAQDA5rSSrSlPSHLRfIQnyez1q5J872ouDAAANrOVhPh9SY7aybGHZtqyAgAA7IGVhPg7k1xQVT84Pzh7/cokV6/mwgAAYDNbyR7xc5K8Pcn7q+qOTBdrHpvpgs0/TfLC1V8eAABsTit5oM+XkvxgVT0jyb9K8u1J/m+SP+/ud++n9QEAwKa0y60pVXVUVb2tqk5dGuvuP+7ul3f3z3X3y6dp9baqOna/rxYAADaJ3e0R/89JTkiyqzPe707yyNiaAgAAe2x3If7jSS7r7t7ZhNmx1yc5YzUXBgAAm9nuQvwRSW7ag8/5ZJKtu5tUVWdW1R9V1eer6p6qurGq/v3CnKqql1TVZ6vqvqr6QFU9fpnPOqmqbqiqHVV1W1WdX1Vb9mCtAAAw3O5C/L4kh+3B53zrbO7unJPkniS/mORHkrw3yZuq6vlzc16U5NwkFyZ55mz+9VV13NKEqjoyyfVJOtOZ+PMzbY152R6sAQAAhtvdXVM+mimY37mbeWfM5u7OM7v7zrnX76mqh2UK9Euq6iGZQvyV3X1pklTVh5PckuR5SV46e9/ZSQ5K8qzuvjvJdVV1WJLzquqi2RgAAKxbuzsj/tokP1NVP72zCVX1U0n+Y5JLd/dlCxG+5GOZ7keeJE/MdAb+yrn33JvpYUGnzb3ntCTXLgT3FZni/JTdrQMAAEbb5Rnx7r6qqn4zye9W1fOS/HGSWzNtCXl4klOTnJzkNd39B3u5hifmG/vQT0zyQJJPL8z5ZJKz5l6fmOQ9C2u9tap2zI55yicAAOvabh/o090vrKr3ZbqV4S8l+ZbZoa9leqLmGd39jr358qp6aqZtLc+ZDR2Z5J7ufmBh6vYkB1fVgd399dm8u5b5yO2zYzv7vucmeW6SPPzhD9+bJQMAwKrYoydrdvfVSa6uqgOSHDUb/lJ3//3efnFVbU3ypiRv7+43zn/dctOXObazebu61eLlSS5PkpNPPnmn8wAAYH/b40fcJ8ksvG/f1y+tqocmuSbTNpefnDu0PcmhVbVl4az4EUl2dPf9c/OOWOajD8/yZ8oBAGBd2d3Fmquuqg5O8o4kByb54dnFmEtuTrIlyaMX3nbi7Nj8vBMXPvf4JIcszAMAgHVpTUN8trXlLUm+M8lp3f3FhSkfSnJ3kjPn3nNwpvuJXzM375okp1bVoXNjZ2W6l/n798PSAQBgVa1oa8oqeF2S05P8QpKHVtX3zR37WHd/taouSHJuVW3PdHb7nEz/YLhkbu5lSV6Q5KqqujDJCUnOS3Kxe4gDALARrHWI/+vZn7+5zLFHZnpwzwWZwvvFmS4M3Zbk6d39j3vTu3v77I4rl2a6VeFdSV6TKcYBAGDdW9MQ7+6tezCnk7xi9rOreTclecrqrAwAANbWml+sCQAACHEAABhCiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYYM1DvKoeXVWvr6qPV9UDVfW+ZeZUVb2kqj5bVfdV1Qeq6vHLzDupqm6oqh1VdVtVnV9VW9bi9wAAgH0x4oz4Y5OcnuSvZz/LeVGSc5NcmOSZSe5Jcn1VHbc0oaqOTHJ9kk5yRpLzk7wwycv228oBAGCVjAjxq7v7+O4+M8knFg9W1UMyhfgru/vS7r4+yZmZgvt5c1PPTnJQkmd193XdfVmmCD+nqg7b778FAADsgzUP8e7+h91MeWKSw5JcOfeee5NcneS0uXmnJbm2u++eG7siU5yfsjqrBQCA/WM9Xqx5YpIHknx6YfyTs2Pz826en9DdtybZsTAPAADWnfUY4kcmuae7H1gY357k4Ko6cG7eXcu8f/vsGAAArFvrMcSTaT/4olrm2M7mLTeeqnpuVW2rqm133HHHPi4RAAD23noM8e1JDl3mNoRHJNnR3ffPzTtimfcfnuXPlKe7L+/uk7v75GOOOWZ1VgsAAHthPYb4zUm2JHn0wvjinvCbs7AXvKqOT3LIwjwAAFh31mOIfyjJ3ZluWZgkqaqDM91P/Jq5edckObWqDp0bOyvJfUnevwbrBACAvXbAWn/hLKpPn738jiSHVdWPzV6/q7t3VNUFSc6tqu2Zzm6fk+kfDZfMfdRlSV6Q5KqqujDJCUnOS3Lxwi0NAQBg3VnzEE9ybJK3LIwtvX5kkluSXJApvF+c5Kgk25I8vbtvX3pDd2+vqqcmuTTTPcbvSvKaTDEOAADr2pqHeHffkm/cAWVnczrJK2Y/u5p3U5KnrNriAABgjazHPeIAALDpCXEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAAMIAQBwCAAYQ4AAAMIMQBAGAAIQ4AAAMIcQAAGECIAwDAAEIcAAAGEOIAADCAEAcAgAGEOAAADCDEAQBgACEOAAADCHEAABhAiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAGzrEq+qkqrqhqnZU1W1VdX5VbRm9LgAA2J0DRi9gb1XVkUmuT3JTkjOSPCrJqzP94+KlA5cGAAC7tWFDPMnZSQ5K8qzuvjvJdVV1WJLzquqi2RgAAKxLG3lrymlJrl0I7isyxfkpY5YEAAB7ZiOH+IlJbp4f6O5bk+yYHQMAgHVrI4f4kUnuWmZ8++wYAACsWxt5j3iS9DJjtZPxVNVzkzx39vKeqvrU/loY7IOjk9w5ehGbRV04egXAGvH/zlXk/52r6hE7O7CRQ3x7kiOWGT88y58pT3dfnuTy/bck2HdVta27Tx69DoCNxP872Yg28taUm7OwF7yqjk9ySBb2jgMAwHqzkUP8miSnVtWhc2NnJbkvyfvHLAkAAPbMRg7xy5J8LclVVfW02f7v85Jc7B7ibHC2TwGsnP93suFU97LXNW4IVXVSkkuTfH+mfeFvSHJedz8wcl0AALA7GzrEAQBgo9rIW1Ng06iqk6rqhqraUVW3VdX5VbVl9LoA1rOqenRVvb6qPl5VD1TV+0avCVZiI9++EDaFqjoyyfVJbkpyRpJHJXl1pn8ov3Tg0gDWu8cmOT3JnyU5cPBaYMVsTYHBqurFSX4lySOWLjSuql/JdPHxcS4+BlheVX1Td//D7O9vTXJ0d//Q2FXBnrM1BcY7Lcm1C8F9RZKDkpwyZkkA699ShMNGJcRhvBOz8BCq7r41yY4sPLQKANg8hDiMd2Sm228u2j47BgBsQkIc1oflLtaonYwDAJuAEIfxtic5Ypnxw7P8mXIAYBMQ4jDezVnYC15Vxyc5JAt7xwGAzUOIw3jXJDm1qg6dGzsryX1J3j9mSQDA/uaBPjDeZUlekOSqqrowyQmZ7iF+sXuIA+xcVR2c6YE+SfIdSQ6rqh+bvX5Xd+8YszLYMx7oA+tAVZ2U5NIk359pX/gbkpzX3Q+MXBfAelZVW5N8ZieHH9ndt6zdamDlhDgAAAxgjzgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAAQhwAAAYQ4gAbSFU9u6purKqvVNX2qvpYVV28xms4r6ruXMPve2tVvW+tvg9grQhxgA2iql6c6WFP1yZ5VpKfSvL2JD+yxkt5Q5JT1/g7ATYdD/QB2CCq6vNJ/rC7f35hvHof/2deVVuSbOnur+/L5+wPVfXWJEd39w+NXgvAanJGHGDjOCLJFxYH5yO8qn6oqrqqHjc/p6reNwvapddvrKptVfVvq+oTSb6a5Htn7z194b1bquoLVfXy2et/3JpSVYdU1b1V9XOL65p9/v+Ye/3wqrqiqr5cVTuq6tqq+q6F9xxfVe+qqvuq6paq+tmV/ScC2DiEOMDG8dEkz6+qn66qo1bh87YmuSjJK5OcnuQzSf53krMW5p2S5NuSvHnxA7r73iTvWHxPVZ2Q5HuW3lNVD03ywSTfleTsJD+e5JAk11fVQbM5lWmrzeOS/EySc5L8QpLv39dfFGA9OmD0AgDYYz+f5A+TvDFJV9Unk7wtyau6++69+Lyjkjytu/9iaaCqrkhyXlV9S3d/bTZ8VpKbuvv/7ORzrkjy1qp6WHffNvee7UnePXv9i5nC+/Hd/eXZd/1pkluSPCfJa5OcluS7k3xfd//5bM6NSf4myaf34vcDWNecEQfYILr7L5M8JtPFma9LUknOTbKtqr51Lz7y8/MRPnNlkkOTPCNJquqATBeGXrGLz7kmyT1JzpwbOyvJH8ztOX9akuuS3F1VB8w+9ytJbkxy8mzOE5LcvhThSdLdfzebA7DpCHGADaS7v9bdV3f387r7pCQ/m+Q7M23lWKnbl/n8z2faQrK01eSpSY7OLkK8u7+aaUvJWUky2/f9Lxbec/Ts+P0LP09OcvxsznFJvrjMVyw3BrDh2ZoCsIF19+9U1UVJTpwNfXX254ELUx+aZPHe3zu708qbk1ww27t9VpKPdffutoa8OcnVVfXw2XvuSPKeueNfTvJHSV6+zHu/MvvzC0mOXeb4sUnu2833A2w4zogDbBBV9U8itaqOSXJ4vnF2+3OzPx8zN+f4TBdJ7qm3JDkoyY/Ofna1LWXJuzPtCf/xTCH+1u5+YO74DUkem+QT3b1t4edTszkfSfJtVfW9c2t/eJJ/uYK1A2wYzogDbBx/VVVvzxS9X0zyiCS/lGRHkt9Lku7+XFV9JMnLq2pHphMuL8l0RnqPdPcXZ0+yfFWmWyZeuQfvub+q/iDTnU6+Pcni7QwvTvKTSd5TVZck+XymO7GckuSD3f37Sd6V5ONJ3lJVv5rp7P75sTUF2KScEQfYOM7PdMvB/5opxl+e5BNJntDdn5mb9x+S3Jrkfyb59dn7PpWVuSJTUP9Zd9+ywvfcluRP5g90951Jvi/JzUleM1v/RZnO5v/lbE5nuhD1piT/Lcl/SXJpkg+vcO0AG4InawIAwADOiAMAwABCHAAABhDiAAAwgBAHAIABhDgAAAwgxAEAYAAhDgAAAwhxAAAYQIgDAMAA/x8gCcPGAGGPKgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'png'\n",
    "ax = dftrain_raw['Survived'].value_counts().plot(kind = 'bar',\n",
    "     figsize = (12,8),fontsize=15,rot = 0)\n",
    "ax.set_ylabel('Counts',fontsize = 15)\n",
    "ax.set_xlabel('Survived',fontsize = 15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "年龄分布情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'png'\n",
    "ax = dftrain_raw['Age'].plot(kind = 'hist',bins = 20,color= 'purple',\n",
    "                    figsize = (12,8),fontsize=15)\n",
    "\n",
    "ax.set_ylabel('Frequency',fontsize = 15)\n",
    "ax.set_xlabel('Age',fontsize = 15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "年龄和label的相关性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvAAAAHqCAYAAABiA3oaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAACDcklEQVR4nOzdd3yV5f3/8deVPchkQxKm7E0AQRRRQMWBG6VaR63VtnZq7ddqXa2ttWrbX5e2dStaZ90oKioiG2RvSEjCCplkj+v3x30CIWSdcHJGzvv5eJzHSa77vq7zyS2efHKdz3XdxlqLiIiIiIgEhhBfByAiIiIiIq2nBF5EREREJIAogRcRERERCSBK4EVEREREAogSeBERERGRAKIEXkREREQkgIT5OoBA06VLF9u3b19fhyEiIiIiHdyqVatyrbVdG7YrgXdT3759Wblypa/DEBEREZEOzhiT0Vi7SmhERERERAKIEngRERERkQCiBF5EREREJIAogRcRERERCSBaxCoiIiLiZ6qqqsjKyqK8vNzXoUg7Cg0NJTExkS5duhAS0vp5dSXwIiIiIn4mKyuLuLg4+vbtizHG1+FIO7DWUlVVxYEDB8jKyiItLa3VfVVCIyIiIuJnysvL6dy5s5L3DswYQ0REBL1796akpMStvkrgRURERPyQkvfg4E7pzNE+7RCHiIiIiIi0EyXwIiIiIuKXbrnlFh588EGPj3vfffdxzTXXeHxcb1ECLyIiIiJuWbx4MVOmTCEhIYHk5GROO+00VqxY4fHX+ec//8k999zj8XHb29q1axk/fjwxMTGMHz+etWvXenR8JfAiIiIi0mpFRUVccMEF3HbbbeTl5ZGdnc29995LZGSkW+NYa6mtrW2nKH2nsrKSOXPmcM0115Cfn891113HnDlzqKys9NhrKIEXERERkVbbtm0bAFdffTWhoaFER0cza9YsRo0adUJpyp49ezDGUF1dDcCZZ57Jr371K0477TRiYmJ46KGHSE9PP278xx9/nIsuugiA66+/nrvvvhuAoUOH8u677x49r7q6mi5durB69WoAli5dypQpU0hMTGT06NEsWrTo6Lm7d+9m2rRpxMXFMXPmTHJzcz1/YVwWLVpEdXU1P/nJT4iMjORHP/oR1lo+/fRTj72GEngRERERabVBgwYRGhrKddddxwcffEB+fr5b/Z9/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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'png'\n",
    "ax = dftrain_raw.query('Survived == 0')['Age'].plot(kind = 'density',\n",
    "                      figsize = (12,8),fontsize=15)\n",
    "dftrain_raw.query('Survived == 1')['Age'].plot(kind = 'density',\n",
    "                      figsize = (12,8),fontsize=15)\n",
    "ax.legend(['Survived==0','Survived==1'],fontsize = 12)\n",
    "ax.set_ylabel('Density',fontsize = 15)\n",
    "ax.set_xlabel('Age',fontsize = 15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面为正式的数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train.shape = (712, 15)\n",
      "x_test.shape = (179, 15)\n",
      "y_train.shape = (712, 1)\n",
      "y_test.shape = (179, 1)\n"
     ]
    }
   ],
   "source": [
    "def preprocessing(dfdata):\n",
    "\n",
    "    dfresult= pd.DataFrame()\n",
    "\n",
    "    #Pclass\n",
    "    dfPclass = pd.get_dummies(dfdata['Pclass'])\n",
    "    dfPclass.columns = ['Pclass_' +str(x) for x in dfPclass.columns ]\n",
    "    dfresult = pd.concat([dfresult,dfPclass],axis = 1)\n",
    "\n",
    "    #Sex\n",
    "    dfSex = pd.get_dummies(dfdata['Sex'])\n",
    "    dfresult = pd.concat([dfresult,dfSex],axis = 1)\n",
    "\n",
    "    #Age\n",
    "    dfresult['Age'] = dfdata['Age'].fillna(0)\n",
    "    dfresult['Age_null'] = pd.isna(dfdata['Age']).astype('int32')\n",
    "\n",
    "    #SibSp,Parch,Fare\n",
    "    dfresult['SibSp'] = dfdata['SibSp']\n",
    "    dfresult['Parch'] = dfdata['Parch']\n",
    "    dfresult['Fare'] = dfdata['Fare']\n",
    "\n",
    "    #Carbin\n",
    "    dfresult['Cabin_null'] =  pd.isna(dfdata['Cabin']).astype('int32')\n",
    "\n",
    "    #Embarked\n",
    "    dfEmbarked = pd.get_dummies(dfdata['Embarked'],dummy_na=True)\n",
    "    dfEmbarked.columns = ['Embarked_' + str(x) for x in dfEmbarked.columns]\n",
    "    dfresult = pd.concat([dfresult,dfEmbarked],axis = 1)\n",
    "\n",
    "    return(dfresult)\n",
    "\n",
    "x_train = preprocessing(dftrain_raw).values\n",
    "y_train = dftrain_raw[['Survived']].values\n",
    "\n",
    "x_test = preprocessing(dftest_raw).values\n",
    "y_test = dftest_raw[['Survived']].values\n",
    "\n",
    "print(\"x_train.shape =\", x_train.shape )\n",
    "print(\"x_test.shape =\", x_test.shape )\n",
    "\n",
    "print(\"y_train.shape =\", y_train.shape )\n",
    "print(\"y_test.shape =\", y_test.shape )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "进一步使用DataLoader和TensorDataset封装成可以迭代的数据管道。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "dl_train = DataLoader(TensorDataset(torch.tensor(x_train).float(),torch.tensor(y_train).float()),\n",
    "                     shuffle = True, batch_size = 8)\n",
    "dl_valid = DataLoader(TensorDataset(torch.tensor(x_test).float(),torch.tensor(y_test).float()),\n",
    "                     shuffle = False, batch_size = 8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 38.0000,  0.0000,  0.0000,\n",
      "          0.0000,  7.8958,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 0.0000,  1.0000,  0.0000,  1.0000,  0.0000, 29.0000,  0.0000,  1.0000,\n",
      "          0.0000, 26.0000,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 1.0000,  0.0000,  0.0000,  1.0000,  0.0000, 50.0000,  0.0000,  0.0000,\n",
      "          0.0000, 28.7125,  0.0000,  1.0000,  0.0000,  0.0000,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 23.0000,  0.0000,  0.0000,\n",
      "          0.0000,  7.8958,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 22.0000,  0.0000,  0.0000,\n",
      "          0.0000,  7.5208,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 25.0000,  0.0000,  0.0000,\n",
      "          0.0000,  0.0000,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 19.0000,  0.0000,  0.0000,\n",
      "          0.0000,  8.1583,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000,  0.0000,  1.0000, 22.0000,  0.0000,  0.0000,\n",
      "          0.0000,  7.7958,  1.0000,  0.0000,  0.0000,  1.0000,  0.0000]])\n",
      "tensor([[0.],\n",
      "        [1.],\n",
      "        [0.],\n",
      "        [0.],\n",
      "        [0.],\n",
      "        [1.],\n",
      "        [0.],\n",
      "        [0.]])\n"
     ]
    }
   ],
   "source": [
    "# 测试数据管道\n",
    "for features,labels in dl_train:\n",
    "    print(features)\n",
    "    print(labels)\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二，定义模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用Pytorch通常有三种方式构建模型：\n",
    "- 使用nn.Sequential按层顺序构建模型，\n",
    "- 继承nn.Module基类构建自定义模型，\n",
    "- 继承nn.Module基类构建模型并辅助应用模型容器进行封装。\n",
    "\n",
    "此处选择使用最简单的nn.Sequential，按层顺序模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sequential(\n",
      "  (linear1): Linear(in_features=15, out_features=20, bias=True)\n",
      "  (relu1): ReLU()\n",
      "  (linear2): Linear(in_features=20, out_features=15, bias=True)\n",
      "  (relu2): ReLU()\n",
      "  (linear3): Linear(in_features=15, out_features=1, bias=True)\n",
      "  (sigmoid): Sigmoid()\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "def create_net():\n",
    "    net = nn.Sequential()\n",
    "    net.add_module(\"linear1\",nn.Linear(15,20))\n",
    "    net.add_module(\"relu1\",nn.ReLU())\n",
    "    net.add_module(\"linear2\",nn.Linear(20,15))\n",
    "    net.add_module(\"relu2\",nn.ReLU())\n",
    "    net.add_module(\"linear3\",nn.Linear(15,1))\n",
    "    net.add_module(\"sigmoid\",nn.Sigmoid())\n",
    "    return net\n",
    "    \n",
    "net = create_net()\n",
    "print(net)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Linear-1                   [-1, 20]             320\n",
      "              ReLU-2                   [-1, 20]               0\n",
      "            Linear-3                   [-1, 15]             315\n",
      "              ReLU-4                   [-1, 15]               0\n",
      "            Linear-5                    [-1, 1]              16\n",
      "           Sigmoid-6                    [-1, 1]               0\n",
      "================================================================\n",
      "Total params: 651\n",
      "Trainable params: 651\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.000057\n",
      "Forward/backward pass size (MB): 0.000549\n",
      "Params size (MB): 0.002483\n",
      "Estimated Total Size (MB): 0.003090\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "from torchkeras import summary\n",
    "summary(net,input_shape=(15,))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三，训练模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pytorch通常需要用户编写自定义训练循环，训练循环的代码风格因人而异。\n",
    "\n",
    "有3类典型的训练循环代码风格：\n",
    "- 脚本形式训练循环，\n",
    "- 函数形式训练循环，\n",
    "- 类形式训练循环。\n",
    "\n",
    "此处介绍一种较通用的脚本形式。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "loss_func = nn.BCELoss()\n",
    "optimizer = torch.optim.Adam(params=net.parameters(),lr = 0.01)\n",
    "metric_func = lambda y_pred,y_true: accuracy_score(y_true.data.numpy(),y_pred.data.numpy()>0.5)\n",
    "metric_name = \"accuracy\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Start Training...\n",
      "================================================================================2020-11-03 20:55:09\n",
      "[step = 30] loss: 0.682, accuracy: 0.613\n",
      "[step = 60] loss: 0.626, accuracy: 0.660\n",
      "\n",
      "EPOCH = 1, loss = 0.622,accuracy  = 0.667, val_loss = 0.578, val_accuracy = 0.687\n",
      "\n",
      "================================================================================2020-11-03 20:55:09\n",
      "[step = 30] loss: 0.628, accuracy: 0.700\n",
      "[step = 60] loss: 0.588, accuracy: 0.713\n",
      "\n",
      "EPOCH = 2, loss = 0.558,accuracy  = 0.736, val_loss = 0.455, val_accuracy = 0.793\n",
      "\n",
      "================================================================================2020-11-03 20:55:09\n",
      "[step = 30] loss: 0.530, accuracy: 0.762\n",
      "[step = 60] loss: 0.538, accuracy: 0.750\n",
      "\n",
      "EPOCH = 3, loss = 0.533,accuracy  = 0.774, val_loss = 0.467, val_accuracy = 0.739\n",
      "\n",
      "================================================================================2020-11-03 20:55:09\n",
      "[step = 30] loss: 0.534, accuracy: 0.767\n",
      "[step = 60] loss: 0.525, accuracy: 0.758\n",
      "\n",
      "EPOCH = 4, loss = 0.524,accuracy  = 0.765, val_loss = 0.468, val_accuracy = 0.783\n",
      "\n",
      "================================================================================2020-11-03 20:55:09\n",
      "[step = 30] loss: 0.550, accuracy: 0.750\n",
      "[step = 60] loss: 0.529, accuracy: 0.762\n",
      "\n",
      "EPOCH = 5, loss = 0.508,accuracy  = 0.775, val_loss = 0.464, val_accuracy = 0.788\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "[step = 30] loss: 0.490, accuracy: 0.800\n",
      "[step = 60] loss: 0.516, accuracy: 0.777\n",
      "\n",
      "EPOCH = 6, loss = 0.492,accuracy  = 0.791, val_loss = 0.443, val_accuracy = 0.815\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "[step = 30] loss: 0.435, accuracy: 0.833\n",
      "[step = 60] loss: 0.468, accuracy: 0.821\n",
      "\n",
      "EPOCH = 7, loss = 0.476,accuracy  = 0.812, val_loss = 0.452, val_accuracy = 0.777\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "[step = 30] loss: 0.424, accuracy: 0.808\n",
      "[step = 60] loss: 0.445, accuracy: 0.804\n",
      "\n",
      "EPOCH = 8, loss = 0.461,accuracy  = 0.799, val_loss = 0.413, val_accuracy = 0.826\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "[step = 30] loss: 0.453, accuracy: 0.792\n",
      "[step = 60] loss: 0.458, accuracy: 0.800\n",
      "\n",
      "EPOCH = 9, loss = 0.464,accuracy  = 0.795, val_loss = 0.408, val_accuracy = 0.815\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "[step = 30] loss: 0.443, accuracy: 0.812\n",
      "[step = 60] loss: 0.465, accuracy: 0.804\n",
      "\n",
      "EPOCH = 10, loss = 0.459,accuracy  = 0.813, val_loss = 0.401, val_accuracy = 0.799\n",
      "\n",
      "================================================================================2020-11-03 20:55:10\n",
      "Finished Training...\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "log_step_freq = 30\n",
    "\n",
    "dfhistory = pd.DataFrame(columns = [\"epoch\",\"loss\",metric_name,\"val_loss\",\"val_\"+metric_name]) \n",
    "print(\"Start Training...\")\n",
    "nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "print(\"==========\"*8 + \"%s\"%nowtime)\n",
    "\n",
    "for epoch in range(1,epochs+1):  \n",
    "\n",
    "    # 1，训练循环-------------------------------------------------\n",
    "    net.train()\n",
    "    loss_sum = 0.0\n",
    "    metric_sum = 0.0\n",
    "    step = 1\n",
    "    \n",
    "    for step, (features,labels) in enumerate(dl_train, 1):\n",
    "    \n",
    "        # 梯度清零\n",
    "        optimizer.zero_grad()\n",
    "\n",
    "        # 正向传播求损失\n",
    "        predictions = net(features)\n",
    "        loss = loss_func(predictions,labels)\n",
    "        metric = metric_func(predictions,labels)\n",
    "        \n",
    "        # 反向传播求梯度\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        # 打印batch级别日志\n",
    "        loss_sum += loss.item()\n",
    "        metric_sum += metric.item()\n",
    "        if step%log_step_freq == 0:   \n",
    "            print((\"[step = %d] loss: %.3f, \"+metric_name+\": %.3f\") %\n",
    "                  (step, loss_sum/step, metric_sum/step))\n",
    "            \n",
    "    # 2，验证循环-------------------------------------------------\n",
    "    net.eval()\n",
    "    val_loss_sum = 0.0\n",
    "    val_metric_sum = 0.0\n",
    "    val_step = 1\n",
    "\n",
    "    for val_step, (features,labels) in enumerate(dl_valid, 1):\n",
    "        # 关闭梯度计算\n",
    "        with torch.no_grad():\n",
    "            predictions = net(features)\n",
    "            val_loss = loss_func(predictions,labels)\n",
    "            val_metric = metric_func(predictions,labels)\n",
    "        val_loss_sum += val_loss.item()\n",
    "        val_metric_sum += val_metric.item()\n",
    "\n",
    "    # 3，记录日志-------------------------------------------------\n",
    "    info = (epoch, loss_sum/step, metric_sum/step, \n",
    "            val_loss_sum/val_step, val_metric_sum/val_step)\n",
    "    dfhistory.loc[epoch-1] = info\n",
    "    \n",
    "    # 打印epoch级别日志\n",
    "    print((\"\\nEPOCH = %d, loss = %.3f,\"+ metric_name + \\\n",
    "          \"  = %.3f, val_loss = %.3f, \"+\"val_\"+ metric_name+\" = %.3f\") \n",
    "          %info)\n",
    "    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "    print(\"\\n\"+\"==========\"*8 + \"%s\"%nowtime)\n",
    "        \n",
    "print('Finished Training...')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 四，评估模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们首先评估一下模型在训练集和验证集上的效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>epoch</th>\n",
       "      <th>loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>val_loss</th>\n",
       "      <th>val_accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.622041</td>\n",
       "      <td>0.667135</td>\n",
       "      <td>0.577889</td>\n",
       "      <td>0.686594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>0.558130</td>\n",
       "      <td>0.735955</td>\n",
       "      <td>0.455395</td>\n",
       "      <td>0.793478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>0.532612</td>\n",
       "      <td>0.773876</td>\n",
       "      <td>0.466921</td>\n",
       "      <td>0.739130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>0.523626</td>\n",
       "      <td>0.765449</td>\n",
       "      <td>0.467630</td>\n",
       "      <td>0.782609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>0.508202</td>\n",
       "      <td>0.775281</td>\n",
       "      <td>0.464449</td>\n",
       "      <td>0.788043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6.0</td>\n",
       "      <td>0.492476</td>\n",
       "      <td>0.790730</td>\n",
       "      <td>0.443343</td>\n",
       "      <td>0.815217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7.0</td>\n",
       "      <td>0.475736</td>\n",
       "      <td>0.811798</td>\n",
       "      <td>0.452396</td>\n",
       "      <td>0.777174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8.0</td>\n",
       "      <td>0.460931</td>\n",
       "      <td>0.799157</td>\n",
       "      <td>0.413329</td>\n",
       "      <td>0.826087</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9.0</td>\n",
       "      <td>0.463534</td>\n",
       "      <td>0.794944</td>\n",
       "      <td>0.407689</td>\n",
       "      <td>0.815217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10.0</td>\n",
       "      <td>0.458896</td>\n",
       "      <td>0.813202</td>\n",
       "      <td>0.400633</td>\n",
       "      <td>0.798913</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   epoch      loss  accuracy  val_loss  val_accuracy\n",
       "0    1.0  0.622041  0.667135  0.577889      0.686594\n",
       "1    2.0  0.558130  0.735955  0.455395      0.793478\n",
       "2    3.0  0.532612  0.773876  0.466921      0.739130\n",
       "3    4.0  0.523626  0.765449  0.467630      0.782609\n",
       "4    5.0  0.508202  0.775281  0.464449      0.788043\n",
       "5    6.0  0.492476  0.790730  0.443343      0.815217\n",
       "6    7.0  0.475736  0.811798  0.452396      0.777174\n",
       "7    8.0  0.460931  0.799157  0.413329      0.826087\n",
       "8    9.0  0.463534  0.794944  0.407689      0.815217\n",
       "9   10.0  0.458896  0.813202  0.400633      0.798913"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dfhistory "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_metric(dfhistory, metric):\n",
    "    train_metrics = dfhistory[metric]\n",
    "    val_metrics = dfhistory['val_'+metric]\n",
    "    epochs = range(1, len(train_metrics) + 1)\n",
    "    plt.plot(epochs, train_metrics, 'bo--')\n",
    "    plt.plot(epochs, val_metrics, 'ro-')\n",
    "    plt.title('Training and validation '+ metric)\n",
    "    plt.xlabel(\"Epochs\")\n",
    "    plt.ylabel(metric)\n",
    "    plt.legend([\"train_\"+metric, 'val_'+metric])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n",
       "<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 392.14375 277.314375\" width=\"392.14375pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       " <defs>\r\n",
       "  <style type=\"text/css\">\r\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\r\n",
       "  </style>\r\n",
       " </defs>\r\n",
       " <g id=\"figure_1\">\r\n",
       "  <g id=\"patch_1\">\r\n",
       "   <path d=\"M 0 277.314375 \r\n",
       "L 392.14375 277.314375 \r\n",
       "L 392.14375 0 \r\n",
       "L 0 0 \r\n",
       "z\r\n",
       "\" style=\"fill:none;\"/>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_1\">\r\n",
       "   <g id=\"patch_2\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 384.94375 239.758125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "L 50.14375 22.318125 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_1\">\r\n",
       "    <g id=\"xtick_1\">\r\n",
       "     <g id=\"line2d_1\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L 0 3.5 \r\n",
       "\" id=\"mc2b38266b0\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"99.180114\" xlink:href=\"#mc2b38266b0\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_1\">\r\n",
       "      <!-- 2 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 19.1875 8.296875 \r\n",
       "L 53.609375 8.296875 \r\n",
       "L 53.609375 0 \r\n",
       "L 7.328125 0 \r\n",
       "L 7.328125 8.296875 \r\n",
       "Q 12.9375 14.109375 22.625 23.890625 \r\n",
       "Q 32.328125 33.6875 34.8125 36.53125 \r\n",
       "Q 39.546875 41.84375 41.421875 45.53125 \r\n",
       "Q 43.3125 49.21875 43.3125 52.78125 \r\n",
       "Q 43.3125 58.59375 39.234375 62.25 \r\n",
       "Q 35.15625 65.921875 28.609375 65.921875 \r\n",
       "Q 23.96875 65.921875 18.8125 64.3125 \r\n",
       "Q 13.671875 62.703125 7.8125 59.421875 \r\n",
       "L 7.8125 69.390625 \r\n",
       "Q 13.765625 71.78125 18.9375 73 \r\n",
       "Q 24.125 74.21875 28.421875 74.21875 \r\n",
       "Q 39.75 74.21875 46.484375 68.546875 \r\n",
       "Q 53.21875 62.890625 53.21875 53.421875 \r\n",
       "Q 53.21875 48.921875 51.53125 44.890625 \r\n",
       "Q 49.859375 40.875 45.40625 35.40625 \r\n",
       "Q 44.1875 33.984375 37.640625 27.21875 \r\n",
       "Q 31.109375 20.453125 19.1875 8.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-50\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(95.998864 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_2\">\r\n",
       "     <g id=\"line2d_2\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"166.816477\" xlink:href=\"#mc2b38266b0\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_2\">\r\n",
       "      <!-- 4 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 37.796875 64.3125 \r\n",
       "L 12.890625 25.390625 \r\n",
       "L 37.796875 25.390625 \r\n",
       "z\r\n",
       "M 35.203125 72.90625 \r\n",
       "L 47.609375 72.90625 \r\n",
       "L 47.609375 25.390625 \r\n",
       "L 58.015625 25.390625 \r\n",
       "L 58.015625 17.1875 \r\n",
       "L 47.609375 17.1875 \r\n",
       "L 47.609375 0 \r\n",
       "L 37.796875 0 \r\n",
       "L 37.796875 17.1875 \r\n",
       "L 4.890625 17.1875 \r\n",
       "L 4.890625 26.703125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-52\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(163.635227 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_3\">\r\n",
       "     <g id=\"line2d_3\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"234.452841\" xlink:href=\"#mc2b38266b0\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_3\">\r\n",
       "      <!-- 6 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 33.015625 40.375 \r\n",
       "Q 26.375 40.375 22.484375 35.828125 \r\n",
       "Q 18.609375 31.296875 18.609375 23.390625 \r\n",
       "Q 18.609375 15.53125 22.484375 10.953125 \r\n",
       "Q 26.375 6.390625 33.015625 6.390625 \r\n",
       "Q 39.65625 6.390625 43.53125 10.953125 \r\n",
       "Q 47.40625 15.53125 47.40625 23.390625 \r\n",
       "Q 47.40625 31.296875 43.53125 35.828125 \r\n",
       "Q 39.65625 40.375 33.015625 40.375 \r\n",
       "z\r\n",
       "M 52.59375 71.296875 \r\n",
       "L 52.59375 62.3125 \r\n",
       "Q 48.875 64.0625 45.09375 64.984375 \r\n",
       "Q 41.3125 65.921875 37.59375 65.921875 \r\n",
       "Q 27.828125 65.921875 22.671875 59.328125 \r\n",
       "Q 17.53125 52.734375 16.796875 39.40625 \r\n",
       "Q 19.671875 43.65625 24.015625 45.921875 \r\n",
       "Q 28.375 48.1875 33.59375 48.1875 \r\n",
       "Q 44.578125 48.1875 50.953125 41.515625 \r\n",
       "Q 57.328125 34.859375 57.328125 23.390625 \r\n",
       "Q 57.328125 12.15625 50.6875 5.359375 \r\n",
       "Q 44.046875 -1.421875 33.015625 -1.421875 \r\n",
       "Q 20.359375 -1.421875 13.671875 8.265625 \r\n",
       "Q 6.984375 17.96875 6.984375 36.375 \r\n",
       "Q 6.984375 53.65625 15.1875 63.9375 \r\n",
       "Q 23.390625 74.21875 37.203125 74.21875 \r\n",
       "Q 40.921875 74.21875 44.703125 73.484375 \r\n",
       "Q 48.484375 72.75 52.59375 71.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-54\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(231.271591 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_4\">\r\n",
       "     <g id=\"line2d_4\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"302.089205\" xlink:href=\"#mc2b38266b0\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_4\">\r\n",
       "      <!-- 8 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 31.78125 34.625 \r\n",
       "Q 24.75 34.625 20.71875 30.859375 \r\n",
       "Q 16.703125 27.09375 16.703125 20.515625 \r\n",
       "Q 16.703125 13.921875 20.71875 10.15625 \r\n",
       "Q 24.75 6.390625 31.78125 6.390625 \r\n",
       "Q 38.8125 6.390625 42.859375 10.171875 \r\n",
       "Q 46.921875 13.96875 46.921875 20.515625 \r\n",
       "Q 46.921875 27.09375 42.890625 30.859375 \r\n",
       "Q 38.875 34.625 31.78125 34.625 \r\n",
       "z\r\n",
       "M 21.921875 38.8125 \r\n",
       "Q 15.578125 40.375 12.03125 44.71875 \r\n",
       "Q 8.5 49.078125 8.5 55.328125 \r\n",
       "Q 8.5 64.0625 14.71875 69.140625 \r\n",
       "Q 20.953125 74.21875 31.78125 74.21875 \r\n",
       "Q 42.671875 74.21875 48.875 69.140625 \r\n",
       "Q 55.078125 64.0625 55.078125 55.328125 \r\n",
       "Q 55.078125 49.078125 51.53125 44.71875 \r\n",
       "Q 48 40.375 41.703125 38.8125 \r\n",
       "Q 48.828125 37.15625 52.796875 32.3125 \r\n",
       "Q 56.78125 27.484375 56.78125 20.515625 \r\n",
       "Q 56.78125 9.90625 50.3125 4.234375 \r\n",
       "Q 43.84375 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.734375 -1.421875 13.25 4.234375 \r\n",
       "Q 6.78125 9.90625 6.78125 20.515625 \r\n",
       "Q 6.78125 27.484375 10.78125 32.3125 \r\n",
       "Q 14.796875 37.15625 21.921875 38.8125 \r\n",
       "z\r\n",
       "M 18.3125 54.390625 \r\n",
       "Q 18.3125 48.734375 21.84375 45.5625 \r\n",
       "Q 25.390625 42.390625 31.78125 42.390625 \r\n",
       "Q 38.140625 42.390625 41.71875 45.5625 \r\n",
       "Q 45.3125 48.734375 45.3125 54.390625 \r\n",
       "Q 45.3125 60.0625 41.71875 63.234375 \r\n",
       "Q 38.140625 66.40625 31.78125 66.40625 \r\n",
       "Q 25.390625 66.40625 21.84375 63.234375 \r\n",
       "Q 18.3125 60.0625 18.3125 54.390625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-56\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(298.907955 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_5\">\r\n",
       "     <g id=\"line2d_5\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"369.725568\" xlink:href=\"#mc2b38266b0\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_5\">\r\n",
       "      <!-- 10 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 12.40625 8.296875 \r\n",
       "L 28.515625 8.296875 \r\n",
       "L 28.515625 63.921875 \r\n",
       "L 10.984375 60.40625 \r\n",
       "L 10.984375 69.390625 \r\n",
       "L 28.421875 72.90625 \r\n",
       "L 38.28125 72.90625 \r\n",
       "L 38.28125 8.296875 \r\n",
       "L 54.390625 8.296875 \r\n",
       "L 54.390625 0 \r\n",
       "L 12.40625 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-49\"/>\r\n",
       "       <path d=\"M 31.78125 66.40625 \r\n",
       "Q 24.171875 66.40625 20.328125 58.90625 \r\n",
       "Q 16.5 51.421875 16.5 36.375 \r\n",
       "Q 16.5 21.390625 20.328125 13.890625 \r\n",
       "Q 24.171875 6.390625 31.78125 6.390625 \r\n",
       "Q 39.453125 6.390625 43.28125 13.890625 \r\n",
       "Q 47.125 21.390625 47.125 36.375 \r\n",
       "Q 47.125 51.421875 43.28125 58.90625 \r\n",
       "Q 39.453125 66.40625 31.78125 66.40625 \r\n",
       "z\r\n",
       "M 31.78125 74.21875 \r\n",
       "Q 44.046875 74.21875 50.515625 64.515625 \r\n",
       "Q 56.984375 54.828125 56.984375 36.375 \r\n",
       "Q 56.984375 17.96875 50.515625 8.265625 \r\n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \r\n",
       "Q 6.59375 17.96875 6.59375 36.375 \r\n",
       "Q 6.59375 54.828125 13.0625 64.515625 \r\n",
       "Q 19.53125 74.21875 31.78125 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-48\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(363.363068 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_6\">\r\n",
       "     <!-- Epochs -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 55.90625 72.90625 \r\n",
       "L 55.90625 64.59375 \r\n",
       "L 19.671875 64.59375 \r\n",
       "L 19.671875 43.015625 \r\n",
       "L 54.390625 43.015625 \r\n",
       "L 54.390625 34.71875 \r\n",
       "L 19.671875 34.71875 \r\n",
       "L 19.671875 8.296875 \r\n",
       "L 56.78125 8.296875 \r\n",
       "L 56.78125 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-69\"/>\r\n",
       "      <path d=\"M 18.109375 8.203125 \r\n",
       "L 18.109375 -20.796875 \r\n",
       "L 9.078125 -20.796875 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.390625 \r\n",
       "Q 20.953125 51.265625 25.265625 53.625 \r\n",
       "Q 29.59375 56 35.59375 56 \r\n",
       "Q 45.5625 56 51.78125 48.09375 \r\n",
       "Q 58.015625 40.1875 58.015625 27.296875 \r\n",
       "Q 58.015625 14.40625 51.78125 6.484375 \r\n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \r\n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \r\n",
       "Q 20.953125 3.328125 18.109375 8.203125 \r\n",
       "z\r\n",
       "M 48.6875 27.296875 \r\n",
       "Q 48.6875 37.203125 44.609375 42.84375 \r\n",
       "Q 40.53125 48.484375 33.40625 48.484375 \r\n",
       "Q 26.265625 48.484375 22.1875 42.84375 \r\n",
       "Q 18.109375 37.203125 18.109375 27.296875 \r\n",
       "Q 18.109375 17.390625 22.1875 11.75 \r\n",
       "Q 26.265625 6.109375 33.40625 6.109375 \r\n",
       "Q 40.53125 6.109375 44.609375 11.75 \r\n",
       "Q 48.6875 17.390625 48.6875 27.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-112\"/>\r\n",
       "      <path d=\"M 30.609375 48.390625 \r\n",
       "Q 23.390625 48.390625 19.1875 42.75 \r\n",
       "Q 14.984375 37.109375 14.984375 27.296875 \r\n",
       "Q 14.984375 17.484375 19.15625 11.84375 \r\n",
       "Q 23.34375 6.203125 30.609375 6.203125 \r\n",
       "Q 37.796875 6.203125 41.984375 11.859375 \r\n",
       "Q 46.1875 17.53125 46.1875 27.296875 \r\n",
       "Q 46.1875 37.015625 41.984375 42.703125 \r\n",
       "Q 37.796875 48.390625 30.609375 48.390625 \r\n",
       "z\r\n",
       "M 30.609375 56 \r\n",
       "Q 42.328125 56 49.015625 48.375 \r\n",
       "Q 55.71875 40.765625 55.71875 27.296875 \r\n",
       "Q 55.71875 13.875 49.015625 6.21875 \r\n",
       "Q 42.328125 -1.421875 30.609375 -1.421875 \r\n",
       "Q 18.84375 -1.421875 12.171875 6.21875 \r\n",
       "Q 5.515625 13.875 5.515625 27.296875 \r\n",
       "Q 5.515625 40.765625 12.171875 48.375 \r\n",
       "Q 18.84375 56 30.609375 56 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-111\"/>\r\n",
       "      <path d=\"M 48.78125 52.59375 \r\n",
       "L 48.78125 44.1875 \r\n",
       "Q 44.96875 46.296875 41.140625 47.34375 \r\n",
       "Q 37.3125 48.390625 33.40625 48.390625 \r\n",
       "Q 24.65625 48.390625 19.8125 42.84375 \r\n",
       "Q 14.984375 37.3125 14.984375 27.296875 \r\n",
       "Q 14.984375 17.28125 19.8125 11.734375 \r\n",
       "Q 24.65625 6.203125 33.40625 6.203125 \r\n",
       "Q 37.3125 6.203125 41.140625 7.25 \r\n",
       "Q 44.96875 8.296875 48.78125 10.40625 \r\n",
       "L 48.78125 2.09375 \r\n",
       "Q 45.015625 0.34375 40.984375 -0.53125 \r\n",
       "Q 36.96875 -1.421875 32.421875 -1.421875 \r\n",
       "Q 20.0625 -1.421875 12.78125 6.34375 \r\n",
       "Q 5.515625 14.109375 5.515625 27.296875 \r\n",
       "Q 5.515625 40.671875 12.859375 48.328125 \r\n",
       "Q 20.21875 56 33.015625 56 \r\n",
       "Q 37.15625 56 41.109375 55.140625 \r\n",
       "Q 45.0625 54.296875 48.78125 52.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-99\"/>\r\n",
       "      <path d=\"M 54.890625 33.015625 \r\n",
       "L 54.890625 0 \r\n",
       "L 45.90625 0 \r\n",
       "L 45.90625 32.71875 \r\n",
       "Q 45.90625 40.484375 42.875 44.328125 \r\n",
       "Q 39.84375 48.1875 33.796875 48.1875 \r\n",
       "Q 26.515625 48.1875 22.3125 43.546875 \r\n",
       "Q 18.109375 38.921875 18.109375 30.90625 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 75.984375 \r\n",
       "L 18.109375 75.984375 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 21.34375 51.125 25.703125 53.5625 \r\n",
       "Q 30.078125 56 35.796875 56 \r\n",
       "Q 45.21875 56 50.046875 50.171875 \r\n",
       "Q 54.890625 44.34375 54.890625 33.015625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-104\"/>\r\n",
       "      <path d=\"M 44.28125 53.078125 \r\n",
       "L 44.28125 44.578125 \r\n",
       "Q 40.484375 46.53125 36.375 47.5 \r\n",
       "Q 32.28125 48.484375 27.875 48.484375 \r\n",
       "Q 21.1875 48.484375 17.84375 46.4375 \r\n",
       "Q 14.5 44.390625 14.5 40.28125 \r\n",
       "Q 14.5 37.15625 16.890625 35.375 \r\n",
       "Q 19.28125 33.59375 26.515625 31.984375 \r\n",
       "L 29.59375 31.296875 \r\n",
       "Q 39.15625 29.25 43.1875 25.515625 \r\n",
       "Q 47.21875 21.78125 47.21875 15.09375 \r\n",
       "Q 47.21875 7.46875 41.1875 3.015625 \r\n",
       "Q 35.15625 -1.421875 24.609375 -1.421875 \r\n",
       "Q 20.21875 -1.421875 15.453125 -0.5625 \r\n",
       "Q 10.6875 0.296875 5.421875 2 \r\n",
       "L 5.421875 11.28125 \r\n",
       "Q 10.40625 8.6875 15.234375 7.390625 \r\n",
       "Q 20.0625 6.109375 24.8125 6.109375 \r\n",
       "Q 31.15625 6.109375 34.5625 8.28125 \r\n",
       "Q 37.984375 10.453125 37.984375 14.40625 \r\n",
       "Q 37.984375 18.0625 35.515625 20.015625 \r\n",
       "Q 33.0625 21.96875 24.703125 23.78125 \r\n",
       "L 21.578125 24.515625 \r\n",
       "Q 13.234375 26.265625 9.515625 29.90625 \r\n",
       "Q 5.8125 33.546875 5.8125 39.890625 \r\n",
       "Q 5.8125 47.609375 11.28125 51.796875 \r\n",
       "Q 16.75 56 26.8125 56 \r\n",
       "Q 31.78125 56 36.171875 55.265625 \r\n",
       "Q 40.578125 54.546875 44.28125 53.078125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-115\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(199.628125 268.034687)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-69\"/>\r\n",
       "      <use x=\"63.183594\" xlink:href=\"#DejaVuSans-112\"/>\r\n",
       "      <use x=\"126.660156\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "      <use x=\"187.841797\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"242.822266\" xlink:href=\"#DejaVuSans-104\"/>\r\n",
       "      <use x=\"306.201172\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_2\">\r\n",
       "    <g id=\"ytick_1\">\r\n",
       "     <g id=\"line2d_6\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L -3.5 0 \r\n",
       "\" id=\"m555d23c3fe\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#m555d23c3fe\" y=\"230.43952\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_7\">\r\n",
       "      <!-- 0.40 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 10.6875 12.40625 \r\n",
       "L 21 12.40625 \r\n",
       "L 21 0 \r\n",
       "L 10.6875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-46\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(20.878125 234.238738)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_2\">\r\n",
       "     <g id=\"line2d_7\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#m555d23c3fe\" y=\"185.799714\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_8\">\r\n",
       "      <!-- 0.45 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 10.796875 72.90625 \r\n",
       "L 49.515625 72.90625 \r\n",
       "L 49.515625 64.59375 \r\n",
       "L 19.828125 64.59375 \r\n",
       "L 19.828125 46.734375 \r\n",
       "Q 21.96875 47.46875 24.109375 47.828125 \r\n",
       "Q 26.265625 48.1875 28.421875 48.1875 \r\n",
       "Q 40.625 48.1875 47.75 41.5 \r\n",
       "Q 54.890625 34.8125 54.890625 23.390625 \r\n",
       "Q 54.890625 11.625 47.5625 5.09375 \r\n",
       "Q 40.234375 -1.421875 26.90625 -1.421875 \r\n",
       "Q 22.3125 -1.421875 17.546875 -0.640625 \r\n",
       "Q 12.796875 0.140625 7.71875 1.703125 \r\n",
       "L 7.71875 11.625 \r\n",
       "Q 12.109375 9.234375 16.796875 8.0625 \r\n",
       "Q 21.484375 6.890625 26.703125 6.890625 \r\n",
       "Q 35.15625 6.890625 40.078125 11.328125 \r\n",
       "Q 45.015625 15.765625 45.015625 23.390625 \r\n",
       "Q 45.015625 31 40.078125 35.4375 \r\n",
       "Q 35.15625 39.890625 26.703125 39.890625 \r\n",
       "Q 22.75 39.890625 18.8125 39.015625 \r\n",
       "Q 14.890625 38.140625 10.796875 36.28125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-53\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(20.878125 189.598933)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_3\">\r\n",
       "     <g id=\"line2d_8\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#m555d23c3fe\" y=\"141.159908\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_9\">\r\n",
       "      <!-- 0.50 -->\r\n",
       "      <g transform=\"translate(20.878125 144.959127)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_4\">\r\n",
       "     <g id=\"line2d_9\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#m555d23c3fe\" y=\"96.520103\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_10\">\r\n",
       "      <!-- 0.55 -->\r\n",
       "      <g transform=\"translate(20.878125 100.319322)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_5\">\r\n",
       "     <g id=\"line2d_10\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#m555d23c3fe\" y=\"51.880297\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_11\">\r\n",
       "      <!-- 0.60 -->\r\n",
       "      <g transform=\"translate(20.878125 55.679516)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_12\">\r\n",
       "     <!-- loss -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-108\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(14.798438 140.695937)rotate(-90)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "      <use x=\"27.783203\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "      <use x=\"88.964844\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "      <use x=\"141.064453\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"line2d_11\">\r\n",
       "    <path clip-path=\"url(#p2c7158f085)\" d=\"M 65.361932 32.201761 \r\n",
       "L 99.180114 89.261425 \r\n",
       "L 132.998295 112.044434 \r\n",
       "L 166.816477 120.067061 \r\n",
       "L 200.634659 133.837023 \r\n",
       "L 234.452841 147.877159 \r\n",
       "L 268.271023 162.82255 \r\n",
       "L 302.089205 176.040781 \r\n",
       "L 335.907386 173.716457 \r\n",
       "L 369.725568 177.857631 \r\n",
       "\" style=\"fill:none;stroke:#0000ff;stroke-dasharray:5.55,2.4;stroke-dashoffset:0;stroke-width:1.5;\"/>\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m9fa4f48a98\" style=\"stroke:#0000ff;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#p2c7158f085)\">\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"65.361932\" xlink:href=\"#m9fa4f48a98\" y=\"32.201761\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"99.180114\" xlink:href=\"#m9fa4f48a98\" y=\"89.261425\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"132.998295\" xlink:href=\"#m9fa4f48a98\" y=\"112.044434\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"166.816477\" xlink:href=\"#m9fa4f48a98\" y=\"120.067061\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"200.634659\" xlink:href=\"#m9fa4f48a98\" y=\"133.837023\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"234.452841\" xlink:href=\"#m9fa4f48a98\" y=\"147.877159\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"268.271023\" xlink:href=\"#m9fa4f48a98\" y=\"162.82255\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"302.089205\" xlink:href=\"#m9fa4f48a98\" y=\"176.040781\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"335.907386\" xlink:href=\"#m9fa4f48a98\" y=\"173.716457\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"369.725568\" xlink:href=\"#m9fa4f48a98\" y=\"177.857631\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"line2d_12\">\r\n",
       "    <path clip-path=\"url(#p2c7158f085)\" d=\"M 65.361932 71.620869 \r\n",
       "L 99.180114 180.982792 \r\n",
       "L 132.998295 170.692453 \r\n",
       "L 166.816477 170.059744 \r\n",
       "L 200.634659 172.899571 \r\n",
       "L 234.452841 191.742941 \r\n",
       "L 268.271023 183.660141 \r\n",
       "L 302.089205 218.539561 \r\n",
       "L 335.907386 223.574507 \r\n",
       "L 369.725568 229.874489 \r\n",
       "\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m2100c6f3de\" style=\"stroke:#ff0000;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#p2c7158f085)\">\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"65.361932\" xlink:href=\"#m2100c6f3de\" y=\"71.620869\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"99.180114\" xlink:href=\"#m2100c6f3de\" y=\"180.982792\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"132.998295\" xlink:href=\"#m2100c6f3de\" y=\"170.692453\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"166.816477\" xlink:href=\"#m2100c6f3de\" y=\"170.059744\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"200.634659\" xlink:href=\"#m2100c6f3de\" y=\"172.899571\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"234.452841\" xlink:href=\"#m2100c6f3de\" y=\"191.742941\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"268.271023\" xlink:href=\"#m2100c6f3de\" y=\"183.660141\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"302.089205\" xlink:href=\"#m2100c6f3de\" y=\"218.539561\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"335.907386\" xlink:href=\"#m2100c6f3de\" y=\"223.574507\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"369.725568\" xlink:href=\"#m2100c6f3de\" y=\"229.874489\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_3\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 50.14375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_4\">\r\n",
       "    <path d=\"M 384.94375 239.758125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_5\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 384.94375 239.758125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_6\">\r\n",
       "    <path d=\"M 50.14375 22.318125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_13\">\r\n",
       "    <!-- Training and validation loss -->\r\n",
       "    <defs>\r\n",
       "     <path d=\"M -0.296875 72.90625 \r\n",
       "L 61.375 72.90625 \r\n",
       "L 61.375 64.59375 \r\n",
       "L 35.5 64.59375 \r\n",
       "L 35.5 0 \r\n",
       "L 25.59375 0 \r\n",
       "L 25.59375 64.59375 \r\n",
       "L -0.296875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-84\"/>\r\n",
       "     <path d=\"M 41.109375 46.296875 \r\n",
       "Q 39.59375 47.171875 37.8125 47.578125 \r\n",
       "Q 36.03125 48 33.890625 48 \r\n",
       "Q 26.265625 48 22.1875 43.046875 \r\n",
       "Q 18.109375 38.09375 18.109375 28.8125 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 20.953125 51.171875 25.484375 53.578125 \r\n",
       "Q 30.03125 56 36.53125 56 \r\n",
       "Q 37.453125 56 38.578125 55.875 \r\n",
       "Q 39.703125 55.765625 41.0625 55.515625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-114\"/>\r\n",
       "     <path d=\"M 34.28125 27.484375 \r\n",
       "Q 23.390625 27.484375 19.1875 25 \r\n",
       "Q 14.984375 22.515625 14.984375 16.5 \r\n",
       "Q 14.984375 11.71875 18.140625 8.90625 \r\n",
       "Q 21.296875 6.109375 26.703125 6.109375 \r\n",
       "Q 34.1875 6.109375 38.703125 11.40625 \r\n",
       "Q 43.21875 16.703125 43.21875 25.484375 \r\n",
       "L 43.21875 27.484375 \r\n",
       "z\r\n",
       "M 52.203125 31.203125 \r\n",
       "L 52.203125 0 \r\n",
       "L 43.21875 0 \r\n",
       "L 43.21875 8.296875 \r\n",
       "Q 40.140625 3.328125 35.546875 0.953125 \r\n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \r\n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \r\n",
       "Q 6 8.015625 6 15.921875 \r\n",
       "Q 6 25.140625 12.171875 29.828125 \r\n",
       "Q 18.359375 34.515625 30.609375 34.515625 \r\n",
       "L 43.21875 34.515625 \r\n",
       "L 43.21875 35.40625 \r\n",
       "Q 43.21875 41.609375 39.140625 45 \r\n",
       "Q 35.0625 48.390625 27.6875 48.390625 \r\n",
       "Q 23 48.390625 18.546875 47.265625 \r\n",
       "Q 14.109375 46.140625 10.015625 43.890625 \r\n",
       "L 10.015625 52.203125 \r\n",
       "Q 14.9375 54.109375 19.578125 55.046875 \r\n",
       "Q 24.21875 56 28.609375 56 \r\n",
       "Q 40.484375 56 46.34375 49.84375 \r\n",
       "Q 52.203125 43.703125 52.203125 31.203125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-97\"/>\r\n",
       "     <path d=\"M 9.421875 54.6875 \r\n",
       "L 18.40625 54.6875 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 64.59375 \r\n",
       "L 9.421875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-105\"/>\r\n",
       "     <path d=\"M 54.890625 33.015625 \r\n",
       "L 54.890625 0 \r\n",
       "L 45.90625 0 \r\n",
       "L 45.90625 32.71875 \r\n",
       "Q 45.90625 40.484375 42.875 44.328125 \r\n",
       "Q 39.84375 48.1875 33.796875 48.1875 \r\n",
       "Q 26.515625 48.1875 22.3125 43.546875 \r\n",
       "Q 18.109375 38.921875 18.109375 30.90625 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 21.34375 51.125 25.703125 53.5625 \r\n",
       "Q 30.078125 56 35.796875 56 \r\n",
       "Q 45.21875 56 50.046875 50.171875 \r\n",
       "Q 54.890625 44.34375 54.890625 33.015625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-110\"/>\r\n",
       "     <path d=\"M 45.40625 27.984375 \r\n",
       "Q 45.40625 37.75 41.375 43.109375 \r\n",
       "Q 37.359375 48.484375 30.078125 48.484375 \r\n",
       "Q 22.859375 48.484375 18.828125 43.109375 \r\n",
       "Q 14.796875 37.75 14.796875 27.984375 \r\n",
       "Q 14.796875 18.265625 18.828125 12.890625 \r\n",
       "Q 22.859375 7.515625 30.078125 7.515625 \r\n",
       "Q 37.359375 7.515625 41.375 12.890625 \r\n",
       "Q 45.40625 18.265625 45.40625 27.984375 \r\n",
       "z\r\n",
       "M 54.390625 6.78125 \r\n",
       "Q 54.390625 -7.171875 48.1875 -13.984375 \r\n",
       "Q 42 -20.796875 29.203125 -20.796875 \r\n",
       "Q 24.46875 -20.796875 20.265625 -20.09375 \r\n",
       "Q 16.0625 -19.390625 12.109375 -17.921875 \r\n",
       "L 12.109375 -9.1875 \r\n",
       "Q 16.0625 -11.328125 19.921875 -12.34375 \r\n",
       "Q 23.78125 -13.375 27.78125 -13.375 \r\n",
       "Q 36.625 -13.375 41.015625 -8.765625 \r\n",
       "Q 45.40625 -4.15625 45.40625 5.171875 \r\n",
       "L 45.40625 9.625 \r\n",
       "Q 42.625 4.78125 38.28125 2.390625 \r\n",
       "Q 33.9375 0 27.875 0 \r\n",
       "Q 17.828125 0 11.671875 7.65625 \r\n",
       "Q 5.515625 15.328125 5.515625 27.984375 \r\n",
       "Q 5.515625 40.671875 11.671875 48.328125 \r\n",
       "Q 17.828125 56 27.875 56 \r\n",
       "Q 33.9375 56 38.28125 53.609375 \r\n",
       "Q 42.625 51.21875 45.40625 46.390625 \r\n",
       "L 45.40625 54.6875 \r\n",
       "L 54.390625 54.6875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-103\"/>\r\n",
       "     <path id=\"DejaVuSans-32\"/>\r\n",
       "     <path d=\"M 45.40625 46.390625 \r\n",
       "L 45.40625 75.984375 \r\n",
       "L 54.390625 75.984375 \r\n",
       "L 54.390625 0 \r\n",
       "L 45.40625 0 \r\n",
       "L 45.40625 8.203125 \r\n",
       "Q 42.578125 3.328125 38.25 0.953125 \r\n",
       "Q 33.9375 -1.421875 27.875 -1.421875 \r\n",
       "Q 17.96875 -1.421875 11.734375 6.484375 \r\n",
       "Q 5.515625 14.40625 5.515625 27.296875 \r\n",
       "Q 5.515625 40.1875 11.734375 48.09375 \r\n",
       "Q 17.96875 56 27.875 56 \r\n",
       "Q 33.9375 56 38.25 53.625 \r\n",
       "Q 42.578125 51.265625 45.40625 46.390625 \r\n",
       "z\r\n",
       "M 14.796875 27.296875 \r\n",
       "Q 14.796875 17.390625 18.875 11.75 \r\n",
       "Q 22.953125 6.109375 30.078125 6.109375 \r\n",
       "Q 37.203125 6.109375 41.296875 11.75 \r\n",
       "Q 45.40625 17.390625 45.40625 27.296875 \r\n",
       "Q 45.40625 37.203125 41.296875 42.84375 \r\n",
       "Q 37.203125 48.484375 30.078125 48.484375 \r\n",
       "Q 22.953125 48.484375 18.875 42.84375 \r\n",
       "Q 14.796875 37.203125 14.796875 27.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-100\"/>\r\n",
       "     <path d=\"M 2.984375 54.6875 \r\n",
       "L 12.5 54.6875 \r\n",
       "L 29.59375 8.796875 \r\n",
       "L 46.6875 54.6875 \r\n",
       "L 56.203125 54.6875 \r\n",
       "L 35.6875 0 \r\n",
       "L 23.484375 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-118\"/>\r\n",
       "     <path d=\"M 18.3125 70.21875 \r\n",
       "L 18.3125 54.6875 \r\n",
       "L 36.8125 54.6875 \r\n",
       "L 36.8125 47.703125 \r\n",
       "L 18.3125 47.703125 \r\n",
       "L 18.3125 18.015625 \r\n",
       "Q 18.3125 11.328125 20.140625 9.421875 \r\n",
       "Q 21.96875 7.515625 27.59375 7.515625 \r\n",
       "L 36.8125 7.515625 \r\n",
       "L 36.8125 0 \r\n",
       "L 27.59375 0 \r\n",
       "Q 17.1875 0 13.234375 3.875 \r\n",
       "Q 9.28125 7.765625 9.28125 18.015625 \r\n",
       "L 9.28125 47.703125 \r\n",
       "L 2.6875 47.703125 \r\n",
       "L 2.6875 54.6875 \r\n",
       "L 9.28125 54.6875 \r\n",
       "L 9.28125 70.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-116\"/>\r\n",
       "    </defs>\r\n",
       "    <g transform=\"translate(135.73375 16.318125)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-84\"/>\r\n",
       "     <use x=\"46.333984\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "     <use x=\"87.447266\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"148.726562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"176.509766\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"239.888672\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"267.671875\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"331.050781\" xlink:href=\"#DejaVuSans-103\"/>\r\n",
       "     <use x=\"394.527344\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"426.314453\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"487.59375\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"550.972656\" xlink:href=\"#DejaVuSans-100\"/>\r\n",
       "     <use x=\"614.449219\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"646.236328\" xlink:href=\"#DejaVuSans-118\"/>\r\n",
       "     <use x=\"705.416016\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"766.695312\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"794.478516\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"822.261719\" xlink:href=\"#DejaVuSans-100\"/>\r\n",
       "     <use x=\"885.738281\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"947.017578\" xlink:href=\"#DejaVuSans-116\"/>\r\n",
       "     <use x=\"986.226562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"1014.009766\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "     <use x=\"1075.191406\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"1138.570312\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"1170.357422\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"1198.140625\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "     <use x=\"1259.322266\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     <use x=\"1311.421875\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"legend_1\">\r\n",
       "    <g id=\"patch_7\">\r\n",
       "     <path d=\"M 298.353125 60.230625 \r\n",
       "L 377.94375 60.230625 \r\n",
       "Q 379.94375 60.230625 379.94375 58.230625 \r\n",
       "L 379.94375 29.318125 \r\n",
       "Q 379.94375 27.318125 377.94375 27.318125 \r\n",
       "L 298.353125 27.318125 \r\n",
       "Q 296.353125 27.318125 296.353125 29.318125 \r\n",
       "L 296.353125 58.230625 \r\n",
       "Q 296.353125 60.230625 298.353125 60.230625 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_13\">\r\n",
       "     <path d=\"M 300.353125 35.416562 \r\n",
       "L 320.353125 35.416562 \r\n",
       "\" style=\"fill:none;stroke:#0000ff;stroke-dasharray:5.55,2.4;stroke-dashoffset:0;stroke-width:1.5;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_14\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"310.353125\" xlink:href=\"#m9fa4f48a98\" y=\"35.416562\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_14\">\r\n",
       "     <!-- train_loss -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 50.984375 -16.609375 \r\n",
       "L 50.984375 -23.578125 \r\n",
       "L -0.984375 -23.578125 \r\n",
       "L -0.984375 -16.609375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-95\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(328.353125 38.916562)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-116\"/>\r\n",
       "      <use x=\"39.208984\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"80.322266\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"141.601562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "      <use x=\"169.384766\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "      <use x=\"232.763672\" xlink:href=\"#DejaVuSans-95\"/>\r\n",
       "      <use x=\"282.763672\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "      <use x=\"310.546875\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "      <use x=\"371.728516\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "      <use x=\"423.828125\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_15\">\r\n",
       "     <path d=\"M 300.353125 50.372812 \r\n",
       "L 320.353125 50.372812 \r\n",
       "\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_16\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"310.353125\" xlink:href=\"#m2100c6f3de\" y=\"50.372812\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_15\">\r\n",
       "     <!-- val_loss -->\r\n",
       "     <g transform=\"translate(328.353125 53.872812)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-118\"/>\r\n",
       "      <use x=\"59.179688\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"120.458984\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "      <use x=\"148.242188\" xlink:href=\"#DejaVuSans-95\"/>\r\n",
       "      <use x=\"198.242188\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "      <use x=\"226.025391\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "      <use x=\"287.207031\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "      <use x=\"339.306641\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       " </g>\r\n",
       " <defs>\r\n",
       "  <clipPath id=\"p2c7158f085\">\r\n",
       "   <rect height=\"217.44\" width=\"334.8\" x=\"50.14375\" y=\"22.318125\"/>\r\n",
       "  </clipPath>\r\n",
       " </defs>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_metric(dfhistory,\"loss\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n",
       "<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 392.14375 277.314375\" width=\"392.14375pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       " <defs>\r\n",
       "  <style type=\"text/css\">\r\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\r\n",
       "  </style>\r\n",
       " </defs>\r\n",
       " <g id=\"figure_1\">\r\n",
       "  <g id=\"patch_1\">\r\n",
       "   <path d=\"M 0 277.314375 \r\n",
       "L 392.14375 277.314375 \r\n",
       "L 392.14375 0 \r\n",
       "L 0 0 \r\n",
       "z\r\n",
       "\" style=\"fill:none;\"/>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_1\">\r\n",
       "   <g id=\"patch_2\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 384.94375 239.758125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "L 50.14375 22.318125 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_1\">\r\n",
       "    <g id=\"xtick_1\">\r\n",
       "     <g id=\"line2d_1\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L 0 3.5 \r\n",
       "\" id=\"m6bbcc6e02f\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"99.180114\" xlink:href=\"#m6bbcc6e02f\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_1\">\r\n",
       "      <!-- 2 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 19.1875 8.296875 \r\n",
       "L 53.609375 8.296875 \r\n",
       "L 53.609375 0 \r\n",
       "L 7.328125 0 \r\n",
       "L 7.328125 8.296875 \r\n",
       "Q 12.9375 14.109375 22.625 23.890625 \r\n",
       "Q 32.328125 33.6875 34.8125 36.53125 \r\n",
       "Q 39.546875 41.84375 41.421875 45.53125 \r\n",
       "Q 43.3125 49.21875 43.3125 52.78125 \r\n",
       "Q 43.3125 58.59375 39.234375 62.25 \r\n",
       "Q 35.15625 65.921875 28.609375 65.921875 \r\n",
       "Q 23.96875 65.921875 18.8125 64.3125 \r\n",
       "Q 13.671875 62.703125 7.8125 59.421875 \r\n",
       "L 7.8125 69.390625 \r\n",
       "Q 13.765625 71.78125 18.9375 73 \r\n",
       "Q 24.125 74.21875 28.421875 74.21875 \r\n",
       "Q 39.75 74.21875 46.484375 68.546875 \r\n",
       "Q 53.21875 62.890625 53.21875 53.421875 \r\n",
       "Q 53.21875 48.921875 51.53125 44.890625 \r\n",
       "Q 49.859375 40.875 45.40625 35.40625 \r\n",
       "Q 44.1875 33.984375 37.640625 27.21875 \r\n",
       "Q 31.109375 20.453125 19.1875 8.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-50\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(95.998864 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_2\">\r\n",
       "     <g id=\"line2d_2\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"166.816477\" xlink:href=\"#m6bbcc6e02f\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_2\">\r\n",
       "      <!-- 4 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 37.796875 64.3125 \r\n",
       "L 12.890625 25.390625 \r\n",
       "L 37.796875 25.390625 \r\n",
       "z\r\n",
       "M 35.203125 72.90625 \r\n",
       "L 47.609375 72.90625 \r\n",
       "L 47.609375 25.390625 \r\n",
       "L 58.015625 25.390625 \r\n",
       "L 58.015625 17.1875 \r\n",
       "L 47.609375 17.1875 \r\n",
       "L 47.609375 0 \r\n",
       "L 37.796875 0 \r\n",
       "L 37.796875 17.1875 \r\n",
       "L 4.890625 17.1875 \r\n",
       "L 4.890625 26.703125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-52\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(163.635227 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_3\">\r\n",
       "     <g id=\"line2d_3\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"234.452841\" xlink:href=\"#m6bbcc6e02f\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_3\">\r\n",
       "      <!-- 6 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 33.015625 40.375 \r\n",
       "Q 26.375 40.375 22.484375 35.828125 \r\n",
       "Q 18.609375 31.296875 18.609375 23.390625 \r\n",
       "Q 18.609375 15.53125 22.484375 10.953125 \r\n",
       "Q 26.375 6.390625 33.015625 6.390625 \r\n",
       "Q 39.65625 6.390625 43.53125 10.953125 \r\n",
       "Q 47.40625 15.53125 47.40625 23.390625 \r\n",
       "Q 47.40625 31.296875 43.53125 35.828125 \r\n",
       "Q 39.65625 40.375 33.015625 40.375 \r\n",
       "z\r\n",
       "M 52.59375 71.296875 \r\n",
       "L 52.59375 62.3125 \r\n",
       "Q 48.875 64.0625 45.09375 64.984375 \r\n",
       "Q 41.3125 65.921875 37.59375 65.921875 \r\n",
       "Q 27.828125 65.921875 22.671875 59.328125 \r\n",
       "Q 17.53125 52.734375 16.796875 39.40625 \r\n",
       "Q 19.671875 43.65625 24.015625 45.921875 \r\n",
       "Q 28.375 48.1875 33.59375 48.1875 \r\n",
       "Q 44.578125 48.1875 50.953125 41.515625 \r\n",
       "Q 57.328125 34.859375 57.328125 23.390625 \r\n",
       "Q 57.328125 12.15625 50.6875 5.359375 \r\n",
       "Q 44.046875 -1.421875 33.015625 -1.421875 \r\n",
       "Q 20.359375 -1.421875 13.671875 8.265625 \r\n",
       "Q 6.984375 17.96875 6.984375 36.375 \r\n",
       "Q 6.984375 53.65625 15.1875 63.9375 \r\n",
       "Q 23.390625 74.21875 37.203125 74.21875 \r\n",
       "Q 40.921875 74.21875 44.703125 73.484375 \r\n",
       "Q 48.484375 72.75 52.59375 71.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-54\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(231.271591 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_4\">\r\n",
       "     <g id=\"line2d_4\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"302.089205\" xlink:href=\"#m6bbcc6e02f\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_4\">\r\n",
       "      <!-- 8 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 31.78125 34.625 \r\n",
       "Q 24.75 34.625 20.71875 30.859375 \r\n",
       "Q 16.703125 27.09375 16.703125 20.515625 \r\n",
       "Q 16.703125 13.921875 20.71875 10.15625 \r\n",
       "Q 24.75 6.390625 31.78125 6.390625 \r\n",
       "Q 38.8125 6.390625 42.859375 10.171875 \r\n",
       "Q 46.921875 13.96875 46.921875 20.515625 \r\n",
       "Q 46.921875 27.09375 42.890625 30.859375 \r\n",
       "Q 38.875 34.625 31.78125 34.625 \r\n",
       "z\r\n",
       "M 21.921875 38.8125 \r\n",
       "Q 15.578125 40.375 12.03125 44.71875 \r\n",
       "Q 8.5 49.078125 8.5 55.328125 \r\n",
       "Q 8.5 64.0625 14.71875 69.140625 \r\n",
       "Q 20.953125 74.21875 31.78125 74.21875 \r\n",
       "Q 42.671875 74.21875 48.875 69.140625 \r\n",
       "Q 55.078125 64.0625 55.078125 55.328125 \r\n",
       "Q 55.078125 49.078125 51.53125 44.71875 \r\n",
       "Q 48 40.375 41.703125 38.8125 \r\n",
       "Q 48.828125 37.15625 52.796875 32.3125 \r\n",
       "Q 56.78125 27.484375 56.78125 20.515625 \r\n",
       "Q 56.78125 9.90625 50.3125 4.234375 \r\n",
       "Q 43.84375 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.734375 -1.421875 13.25 4.234375 \r\n",
       "Q 6.78125 9.90625 6.78125 20.515625 \r\n",
       "Q 6.78125 27.484375 10.78125 32.3125 \r\n",
       "Q 14.796875 37.15625 21.921875 38.8125 \r\n",
       "z\r\n",
       "M 18.3125 54.390625 \r\n",
       "Q 18.3125 48.734375 21.84375 45.5625 \r\n",
       "Q 25.390625 42.390625 31.78125 42.390625 \r\n",
       "Q 38.140625 42.390625 41.71875 45.5625 \r\n",
       "Q 45.3125 48.734375 45.3125 54.390625 \r\n",
       "Q 45.3125 60.0625 41.71875 63.234375 \r\n",
       "Q 38.140625 66.40625 31.78125 66.40625 \r\n",
       "Q 25.390625 66.40625 21.84375 63.234375 \r\n",
       "Q 18.3125 60.0625 18.3125 54.390625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-56\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(298.907955 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_5\">\r\n",
       "     <g id=\"line2d_5\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"369.725568\" xlink:href=\"#m6bbcc6e02f\" y=\"239.758125\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_5\">\r\n",
       "      <!-- 10 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 12.40625 8.296875 \r\n",
       "L 28.515625 8.296875 \r\n",
       "L 28.515625 63.921875 \r\n",
       "L 10.984375 60.40625 \r\n",
       "L 10.984375 69.390625 \r\n",
       "L 28.421875 72.90625 \r\n",
       "L 38.28125 72.90625 \r\n",
       "L 38.28125 8.296875 \r\n",
       "L 54.390625 8.296875 \r\n",
       "L 54.390625 0 \r\n",
       "L 12.40625 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-49\"/>\r\n",
       "       <path d=\"M 31.78125 66.40625 \r\n",
       "Q 24.171875 66.40625 20.328125 58.90625 \r\n",
       "Q 16.5 51.421875 16.5 36.375 \r\n",
       "Q 16.5 21.390625 20.328125 13.890625 \r\n",
       "Q 24.171875 6.390625 31.78125 6.390625 \r\n",
       "Q 39.453125 6.390625 43.28125 13.890625 \r\n",
       "Q 47.125 21.390625 47.125 36.375 \r\n",
       "Q 47.125 51.421875 43.28125 58.90625 \r\n",
       "Q 39.453125 66.40625 31.78125 66.40625 \r\n",
       "z\r\n",
       "M 31.78125 74.21875 \r\n",
       "Q 44.046875 74.21875 50.515625 64.515625 \r\n",
       "Q 56.984375 54.828125 56.984375 36.375 \r\n",
       "Q 56.984375 17.96875 50.515625 8.265625 \r\n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \r\n",
       "Q 6.59375 17.96875 6.59375 36.375 \r\n",
       "Q 6.59375 54.828125 13.0625 64.515625 \r\n",
       "Q 19.53125 74.21875 31.78125 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-48\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(363.363068 254.356562)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_6\">\r\n",
       "     <!-- Epochs -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 55.90625 72.90625 \r\n",
       "L 55.90625 64.59375 \r\n",
       "L 19.671875 64.59375 \r\n",
       "L 19.671875 43.015625 \r\n",
       "L 54.390625 43.015625 \r\n",
       "L 54.390625 34.71875 \r\n",
       "L 19.671875 34.71875 \r\n",
       "L 19.671875 8.296875 \r\n",
       "L 56.78125 8.296875 \r\n",
       "L 56.78125 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-69\"/>\r\n",
       "      <path d=\"M 18.109375 8.203125 \r\n",
       "L 18.109375 -20.796875 \r\n",
       "L 9.078125 -20.796875 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.390625 \r\n",
       "Q 20.953125 51.265625 25.265625 53.625 \r\n",
       "Q 29.59375 56 35.59375 56 \r\n",
       "Q 45.5625 56 51.78125 48.09375 \r\n",
       "Q 58.015625 40.1875 58.015625 27.296875 \r\n",
       "Q 58.015625 14.40625 51.78125 6.484375 \r\n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \r\n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \r\n",
       "Q 20.953125 3.328125 18.109375 8.203125 \r\n",
       "z\r\n",
       "M 48.6875 27.296875 \r\n",
       "Q 48.6875 37.203125 44.609375 42.84375 \r\n",
       "Q 40.53125 48.484375 33.40625 48.484375 \r\n",
       "Q 26.265625 48.484375 22.1875 42.84375 \r\n",
       "Q 18.109375 37.203125 18.109375 27.296875 \r\n",
       "Q 18.109375 17.390625 22.1875 11.75 \r\n",
       "Q 26.265625 6.109375 33.40625 6.109375 \r\n",
       "Q 40.53125 6.109375 44.609375 11.75 \r\n",
       "Q 48.6875 17.390625 48.6875 27.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-112\"/>\r\n",
       "      <path d=\"M 30.609375 48.390625 \r\n",
       "Q 23.390625 48.390625 19.1875 42.75 \r\n",
       "Q 14.984375 37.109375 14.984375 27.296875 \r\n",
       "Q 14.984375 17.484375 19.15625 11.84375 \r\n",
       "Q 23.34375 6.203125 30.609375 6.203125 \r\n",
       "Q 37.796875 6.203125 41.984375 11.859375 \r\n",
       "Q 46.1875 17.53125 46.1875 27.296875 \r\n",
       "Q 46.1875 37.015625 41.984375 42.703125 \r\n",
       "Q 37.796875 48.390625 30.609375 48.390625 \r\n",
       "z\r\n",
       "M 30.609375 56 \r\n",
       "Q 42.328125 56 49.015625 48.375 \r\n",
       "Q 55.71875 40.765625 55.71875 27.296875 \r\n",
       "Q 55.71875 13.875 49.015625 6.21875 \r\n",
       "Q 42.328125 -1.421875 30.609375 -1.421875 \r\n",
       "Q 18.84375 -1.421875 12.171875 6.21875 \r\n",
       "Q 5.515625 13.875 5.515625 27.296875 \r\n",
       "Q 5.515625 40.765625 12.171875 48.375 \r\n",
       "Q 18.84375 56 30.609375 56 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-111\"/>\r\n",
       "      <path d=\"M 48.78125 52.59375 \r\n",
       "L 48.78125 44.1875 \r\n",
       "Q 44.96875 46.296875 41.140625 47.34375 \r\n",
       "Q 37.3125 48.390625 33.40625 48.390625 \r\n",
       "Q 24.65625 48.390625 19.8125 42.84375 \r\n",
       "Q 14.984375 37.3125 14.984375 27.296875 \r\n",
       "Q 14.984375 17.28125 19.8125 11.734375 \r\n",
       "Q 24.65625 6.203125 33.40625 6.203125 \r\n",
       "Q 37.3125 6.203125 41.140625 7.25 \r\n",
       "Q 44.96875 8.296875 48.78125 10.40625 \r\n",
       "L 48.78125 2.09375 \r\n",
       "Q 45.015625 0.34375 40.984375 -0.53125 \r\n",
       "Q 36.96875 -1.421875 32.421875 -1.421875 \r\n",
       "Q 20.0625 -1.421875 12.78125 6.34375 \r\n",
       "Q 5.515625 14.109375 5.515625 27.296875 \r\n",
       "Q 5.515625 40.671875 12.859375 48.328125 \r\n",
       "Q 20.21875 56 33.015625 56 \r\n",
       "Q 37.15625 56 41.109375 55.140625 \r\n",
       "Q 45.0625 54.296875 48.78125 52.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-99\"/>\r\n",
       "      <path d=\"M 54.890625 33.015625 \r\n",
       "L 54.890625 0 \r\n",
       "L 45.90625 0 \r\n",
       "L 45.90625 32.71875 \r\n",
       "Q 45.90625 40.484375 42.875 44.328125 \r\n",
       "Q 39.84375 48.1875 33.796875 48.1875 \r\n",
       "Q 26.515625 48.1875 22.3125 43.546875 \r\n",
       "Q 18.109375 38.921875 18.109375 30.90625 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 75.984375 \r\n",
       "L 18.109375 75.984375 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 21.34375 51.125 25.703125 53.5625 \r\n",
       "Q 30.078125 56 35.796875 56 \r\n",
       "Q 45.21875 56 50.046875 50.171875 \r\n",
       "Q 54.890625 44.34375 54.890625 33.015625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-104\"/>\r\n",
       "      <path d=\"M 44.28125 53.078125 \r\n",
       "L 44.28125 44.578125 \r\n",
       "Q 40.484375 46.53125 36.375 47.5 \r\n",
       "Q 32.28125 48.484375 27.875 48.484375 \r\n",
       "Q 21.1875 48.484375 17.84375 46.4375 \r\n",
       "Q 14.5 44.390625 14.5 40.28125 \r\n",
       "Q 14.5 37.15625 16.890625 35.375 \r\n",
       "Q 19.28125 33.59375 26.515625 31.984375 \r\n",
       "L 29.59375 31.296875 \r\n",
       "Q 39.15625 29.25 43.1875 25.515625 \r\n",
       "Q 47.21875 21.78125 47.21875 15.09375 \r\n",
       "Q 47.21875 7.46875 41.1875 3.015625 \r\n",
       "Q 35.15625 -1.421875 24.609375 -1.421875 \r\n",
       "Q 20.21875 -1.421875 15.453125 -0.5625 \r\n",
       "Q 10.6875 0.296875 5.421875 2 \r\n",
       "L 5.421875 11.28125 \r\n",
       "Q 10.40625 8.6875 15.234375 7.390625 \r\n",
       "Q 20.0625 6.109375 24.8125 6.109375 \r\n",
       "Q 31.15625 6.109375 34.5625 8.28125 \r\n",
       "Q 37.984375 10.453125 37.984375 14.40625 \r\n",
       "Q 37.984375 18.0625 35.515625 20.015625 \r\n",
       "Q 33.0625 21.96875 24.703125 23.78125 \r\n",
       "L 21.578125 24.515625 \r\n",
       "Q 13.234375 26.265625 9.515625 29.90625 \r\n",
       "Q 5.8125 33.546875 5.8125 39.890625 \r\n",
       "Q 5.8125 47.609375 11.28125 51.796875 \r\n",
       "Q 16.75 56 26.8125 56 \r\n",
       "Q 31.78125 56 36.171875 55.265625 \r\n",
       "Q 40.578125 54.546875 44.28125 53.078125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-115\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(199.628125 268.034687)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-69\"/>\r\n",
       "      <use x=\"63.183594\" xlink:href=\"#DejaVuSans-112\"/>\r\n",
       "      <use x=\"126.660156\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "      <use x=\"187.841797\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"242.822266\" xlink:href=\"#DejaVuSans-104\"/>\r\n",
       "      <use x=\"306.201172\" xlink:href=\"#DejaVuSans-115\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_2\">\r\n",
       "    <g id=\"ytick_1\">\r\n",
       "     <g id=\"line2d_6\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L -3.5 0 \r\n",
       "\" id=\"mb8736d163f\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"238.747359\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_7\">\r\n",
       "      <!-- 0.66 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 10.6875 12.40625 \r\n",
       "L 21 12.40625 \r\n",
       "L 21 0 \r\n",
       "L 10.6875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-46\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(20.878125 242.546578)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_2\">\r\n",
       "     <g id=\"line2d_7\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"213.875376\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_8\">\r\n",
       "      <!-- 0.68 -->\r\n",
       "      <g transform=\"translate(20.878125 217.674595)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_3\">\r\n",
       "     <g id=\"line2d_8\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"189.003393\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_9\">\r\n",
       "      <!-- 0.70 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 8.203125 72.90625 \r\n",
       "L 55.078125 72.90625 \r\n",
       "L 55.078125 68.703125 \r\n",
       "L 28.609375 0 \r\n",
       "L 18.3125 0 \r\n",
       "L 43.21875 64.59375 \r\n",
       "L 8.203125 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-55\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(20.878125 192.802612)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_4\">\r\n",
       "     <g id=\"line2d_9\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"164.13141\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_10\">\r\n",
       "      <!-- 0.72 -->\r\n",
       "      <g transform=\"translate(20.878125 167.930629)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_5\">\r\n",
       "     <g id=\"line2d_10\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"139.259427\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_11\">\r\n",
       "      <!-- 0.74 -->\r\n",
       "      <g transform=\"translate(20.878125 143.058646)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_6\">\r\n",
       "     <g id=\"line2d_11\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"114.387444\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_12\">\r\n",
       "      <!-- 0.76 -->\r\n",
       "      <g transform=\"translate(20.878125 118.186663)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_7\">\r\n",
       "     <g id=\"line2d_12\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"89.515461\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_13\">\r\n",
       "      <!-- 0.78 -->\r\n",
       "      <g transform=\"translate(20.878125 93.31468)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_8\">\r\n",
       "     <g id=\"line2d_13\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"64.643478\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_14\">\r\n",
       "      <!-- 0.80 -->\r\n",
       "      <g transform=\"translate(20.878125 68.442697)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_9\">\r\n",
       "     <g id=\"line2d_14\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"50.14375\" xlink:href=\"#mb8736d163f\" y=\"39.771495\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_15\">\r\n",
       "      <!-- 0.82 -->\r\n",
       "      <g transform=\"translate(20.878125 43.570714)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_16\">\r\n",
       "     <!-- accuracy -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 34.28125 27.484375 \r\n",
       "Q 23.390625 27.484375 19.1875 25 \r\n",
       "Q 14.984375 22.515625 14.984375 16.5 \r\n",
       "Q 14.984375 11.71875 18.140625 8.90625 \r\n",
       "Q 21.296875 6.109375 26.703125 6.109375 \r\n",
       "Q 34.1875 6.109375 38.703125 11.40625 \r\n",
       "Q 43.21875 16.703125 43.21875 25.484375 \r\n",
       "L 43.21875 27.484375 \r\n",
       "z\r\n",
       "M 52.203125 31.203125 \r\n",
       "L 52.203125 0 \r\n",
       "L 43.21875 0 \r\n",
       "L 43.21875 8.296875 \r\n",
       "Q 40.140625 3.328125 35.546875 0.953125 \r\n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \r\n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \r\n",
       "Q 6 8.015625 6 15.921875 \r\n",
       "Q 6 25.140625 12.171875 29.828125 \r\n",
       "Q 18.359375 34.515625 30.609375 34.515625 \r\n",
       "L 43.21875 34.515625 \r\n",
       "L 43.21875 35.40625 \r\n",
       "Q 43.21875 41.609375 39.140625 45 \r\n",
       "Q 35.0625 48.390625 27.6875 48.390625 \r\n",
       "Q 23 48.390625 18.546875 47.265625 \r\n",
       "Q 14.109375 46.140625 10.015625 43.890625 \r\n",
       "L 10.015625 52.203125 \r\n",
       "Q 14.9375 54.109375 19.578125 55.046875 \r\n",
       "Q 24.21875 56 28.609375 56 \r\n",
       "Q 40.484375 56 46.34375 49.84375 \r\n",
       "Q 52.203125 43.703125 52.203125 31.203125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-97\"/>\r\n",
       "      <path d=\"M 8.5 21.578125 \r\n",
       "L 8.5 54.6875 \r\n",
       "L 17.484375 54.6875 \r\n",
       "L 17.484375 21.921875 \r\n",
       "Q 17.484375 14.15625 20.5 10.265625 \r\n",
       "Q 23.53125 6.390625 29.59375 6.390625 \r\n",
       "Q 36.859375 6.390625 41.078125 11.03125 \r\n",
       "Q 45.3125 15.671875 45.3125 23.6875 \r\n",
       "L 45.3125 54.6875 \r\n",
       "L 54.296875 54.6875 \r\n",
       "L 54.296875 0 \r\n",
       "L 45.3125 0 \r\n",
       "L 45.3125 8.40625 \r\n",
       "Q 42.046875 3.421875 37.71875 1 \r\n",
       "Q 33.40625 -1.421875 27.6875 -1.421875 \r\n",
       "Q 18.265625 -1.421875 13.375 4.4375 \r\n",
       "Q 8.5 10.296875 8.5 21.578125 \r\n",
       "z\r\n",
       "M 31.109375 56 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-117\"/>\r\n",
       "      <path d=\"M 41.109375 46.296875 \r\n",
       "Q 39.59375 47.171875 37.8125 47.578125 \r\n",
       "Q 36.03125 48 33.890625 48 \r\n",
       "Q 26.265625 48 22.1875 43.046875 \r\n",
       "Q 18.109375 38.09375 18.109375 28.8125 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 20.953125 51.171875 25.484375 53.578125 \r\n",
       "Q 30.03125 56 36.53125 56 \r\n",
       "Q 37.453125 56 38.578125 55.875 \r\n",
       "Q 39.703125 55.765625 41.0625 55.515625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-114\"/>\r\n",
       "      <path d=\"M 32.171875 -5.078125 \r\n",
       "Q 28.375 -14.84375 24.75 -17.8125 \r\n",
       "Q 21.140625 -20.796875 15.09375 -20.796875 \r\n",
       "L 7.90625 -20.796875 \r\n",
       "L 7.90625 -13.28125 \r\n",
       "L 13.1875 -13.28125 \r\n",
       "Q 16.890625 -13.28125 18.9375 -11.515625 \r\n",
       "Q 21 -9.765625 23.484375 -3.21875 \r\n",
       "L 25.09375 0.875 \r\n",
       "L 2.984375 54.6875 \r\n",
       "L 12.5 54.6875 \r\n",
       "L 29.59375 11.921875 \r\n",
       "L 46.6875 54.6875 \r\n",
       "L 56.203125 54.6875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-121\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(14.798438 153.5975)rotate(-90)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"61.279297\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"116.259766\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"171.240234\" xlink:href=\"#DejaVuSans-117\"/>\r\n",
       "      <use x=\"234.619141\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"275.732422\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"337.011719\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"391.992188\" xlink:href=\"#DejaVuSans-121\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"line2d_15\">\r\n",
       "    <path clip-path=\"url(#pbe5c6a8780)\" d=\"M 65.361932 229.874489 \r\n",
       "L 99.180114 144.289716 \r\n",
       "L 132.998295 97.130759 \r\n",
       "L 166.816477 107.610527 \r\n",
       "L 200.634659 95.384131 \r\n",
       "L 234.452841 76.171223 \r\n",
       "L 268.271023 49.971803 \r\n",
       "L 302.089205 65.691455 \r\n",
       "L 335.907386 70.931339 \r\n",
       "L 369.725568 48.225175 \r\n",
       "\" style=\"fill:none;stroke:#0000ff;stroke-dasharray:5.55,2.4;stroke-dashoffset:0;stroke-width:1.5;\"/>\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m9063306cf0\" style=\"stroke:#0000ff;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#pbe5c6a8780)\">\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"65.361932\" xlink:href=\"#m9063306cf0\" y=\"229.874489\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"99.180114\" xlink:href=\"#m9063306cf0\" y=\"144.289716\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"132.998295\" xlink:href=\"#m9063306cf0\" y=\"97.130759\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"166.816477\" xlink:href=\"#m9063306cf0\" y=\"107.610527\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"200.634659\" xlink:href=\"#m9063306cf0\" y=\"95.384131\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"234.452841\" xlink:href=\"#m9063306cf0\" y=\"76.171223\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"268.271023\" xlink:href=\"#m9063306cf0\" y=\"49.971803\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"302.089205\" xlink:href=\"#m9063306cf0\" y=\"65.691455\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"335.907386\" xlink:href=\"#m9063306cf0\" y=\"70.931339\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"369.725568\" xlink:href=\"#m9063306cf0\" y=\"48.225175\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"line2d_16\">\r\n",
       "    <path clip-path=\"url(#pbe5c6a8780)\" d=\"M 65.361932 205.674831 \r\n",
       "L 99.180114 72.753907 \r\n",
       "L 132.998295 140.340818 \r\n",
       "L 166.816477 86.27129 \r\n",
       "L 200.634659 79.512599 \r\n",
       "L 234.452841 45.719143 \r\n",
       "L 268.271023 93.029981 \r\n",
       "L 302.089205 32.201761 \r\n",
       "L 335.907386 45.719143 \r\n",
       "L 369.725568 65.995216 \r\n",
       "\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m44ec9f35c7\" style=\"stroke:#ff0000;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#pbe5c6a8780)\">\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"65.361932\" xlink:href=\"#m44ec9f35c7\" y=\"205.674831\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"99.180114\" xlink:href=\"#m44ec9f35c7\" y=\"72.753907\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"132.998295\" xlink:href=\"#m44ec9f35c7\" y=\"140.340818\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"166.816477\" xlink:href=\"#m44ec9f35c7\" y=\"86.27129\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"200.634659\" xlink:href=\"#m44ec9f35c7\" y=\"79.512599\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"234.452841\" xlink:href=\"#m44ec9f35c7\" y=\"45.719143\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"268.271023\" xlink:href=\"#m44ec9f35c7\" y=\"93.029981\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"302.089205\" xlink:href=\"#m44ec9f35c7\" y=\"32.201761\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"335.907386\" xlink:href=\"#m44ec9f35c7\" y=\"45.719143\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"369.725568\" xlink:href=\"#m44ec9f35c7\" y=\"65.995216\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_3\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 50.14375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_4\">\r\n",
       "    <path d=\"M 384.94375 239.758125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_5\">\r\n",
       "    <path d=\"M 50.14375 239.758125 \r\n",
       "L 384.94375 239.758125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_6\">\r\n",
       "    <path d=\"M 50.14375 22.318125 \r\n",
       "L 384.94375 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_17\">\r\n",
       "    <!-- Training and validation accuracy -->\r\n",
       "    <defs>\r\n",
       "     <path d=\"M -0.296875 72.90625 \r\n",
       "L 61.375 72.90625 \r\n",
       "L 61.375 64.59375 \r\n",
       "L 35.5 64.59375 \r\n",
       "L 35.5 0 \r\n",
       "L 25.59375 0 \r\n",
       "L 25.59375 64.59375 \r\n",
       "L -0.296875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-84\"/>\r\n",
       "     <path d=\"M 9.421875 54.6875 \r\n",
       "L 18.40625 54.6875 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 64.59375 \r\n",
       "L 9.421875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-105\"/>\r\n",
       "     <path d=\"M 54.890625 33.015625 \r\n",
       "L 54.890625 0 \r\n",
       "L 45.90625 0 \r\n",
       "L 45.90625 32.71875 \r\n",
       "Q 45.90625 40.484375 42.875 44.328125 \r\n",
       "Q 39.84375 48.1875 33.796875 48.1875 \r\n",
       "Q 26.515625 48.1875 22.3125 43.546875 \r\n",
       "Q 18.109375 38.921875 18.109375 30.90625 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 21.34375 51.125 25.703125 53.5625 \r\n",
       "Q 30.078125 56 35.796875 56 \r\n",
       "Q 45.21875 56 50.046875 50.171875 \r\n",
       "Q 54.890625 44.34375 54.890625 33.015625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-110\"/>\r\n",
       "     <path d=\"M 45.40625 27.984375 \r\n",
       "Q 45.40625 37.75 41.375 43.109375 \r\n",
       "Q 37.359375 48.484375 30.078125 48.484375 \r\n",
       "Q 22.859375 48.484375 18.828125 43.109375 \r\n",
       "Q 14.796875 37.75 14.796875 27.984375 \r\n",
       "Q 14.796875 18.265625 18.828125 12.890625 \r\n",
       "Q 22.859375 7.515625 30.078125 7.515625 \r\n",
       "Q 37.359375 7.515625 41.375 12.890625 \r\n",
       "Q 45.40625 18.265625 45.40625 27.984375 \r\n",
       "z\r\n",
       "M 54.390625 6.78125 \r\n",
       "Q 54.390625 -7.171875 48.1875 -13.984375 \r\n",
       "Q 42 -20.796875 29.203125 -20.796875 \r\n",
       "Q 24.46875 -20.796875 20.265625 -20.09375 \r\n",
       "Q 16.0625 -19.390625 12.109375 -17.921875 \r\n",
       "L 12.109375 -9.1875 \r\n",
       "Q 16.0625 -11.328125 19.921875 -12.34375 \r\n",
       "Q 23.78125 -13.375 27.78125 -13.375 \r\n",
       "Q 36.625 -13.375 41.015625 -8.765625 \r\n",
       "Q 45.40625 -4.15625 45.40625 5.171875 \r\n",
       "L 45.40625 9.625 \r\n",
       "Q 42.625 4.78125 38.28125 2.390625 \r\n",
       "Q 33.9375 0 27.875 0 \r\n",
       "Q 17.828125 0 11.671875 7.65625 \r\n",
       "Q 5.515625 15.328125 5.515625 27.984375 \r\n",
       "Q 5.515625 40.671875 11.671875 48.328125 \r\n",
       "Q 17.828125 56 27.875 56 \r\n",
       "Q 33.9375 56 38.28125 53.609375 \r\n",
       "Q 42.625 51.21875 45.40625 46.390625 \r\n",
       "L 45.40625 54.6875 \r\n",
       "L 54.390625 54.6875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-103\"/>\r\n",
       "     <path id=\"DejaVuSans-32\"/>\r\n",
       "     <path d=\"M 45.40625 46.390625 \r\n",
       "L 45.40625 75.984375 \r\n",
       "L 54.390625 75.984375 \r\n",
       "L 54.390625 0 \r\n",
       "L 45.40625 0 \r\n",
       "L 45.40625 8.203125 \r\n",
       "Q 42.578125 3.328125 38.25 0.953125 \r\n",
       "Q 33.9375 -1.421875 27.875 -1.421875 \r\n",
       "Q 17.96875 -1.421875 11.734375 6.484375 \r\n",
       "Q 5.515625 14.40625 5.515625 27.296875 \r\n",
       "Q 5.515625 40.1875 11.734375 48.09375 \r\n",
       "Q 17.96875 56 27.875 56 \r\n",
       "Q 33.9375 56 38.25 53.625 \r\n",
       "Q 42.578125 51.265625 45.40625 46.390625 \r\n",
       "z\r\n",
       "M 14.796875 27.296875 \r\n",
       "Q 14.796875 17.390625 18.875 11.75 \r\n",
       "Q 22.953125 6.109375 30.078125 6.109375 \r\n",
       "Q 37.203125 6.109375 41.296875 11.75 \r\n",
       "Q 45.40625 17.390625 45.40625 27.296875 \r\n",
       "Q 45.40625 37.203125 41.296875 42.84375 \r\n",
       "Q 37.203125 48.484375 30.078125 48.484375 \r\n",
       "Q 22.953125 48.484375 18.875 42.84375 \r\n",
       "Q 14.796875 37.203125 14.796875 27.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-100\"/>\r\n",
       "     <path d=\"M 2.984375 54.6875 \r\n",
       "L 12.5 54.6875 \r\n",
       "L 29.59375 8.796875 \r\n",
       "L 46.6875 54.6875 \r\n",
       "L 56.203125 54.6875 \r\n",
       "L 35.6875 0 \r\n",
       "L 23.484375 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-118\"/>\r\n",
       "     <path d=\"M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-108\"/>\r\n",
       "     <path d=\"M 18.3125 70.21875 \r\n",
       "L 18.3125 54.6875 \r\n",
       "L 36.8125 54.6875 \r\n",
       "L 36.8125 47.703125 \r\n",
       "L 18.3125 47.703125 \r\n",
       "L 18.3125 18.015625 \r\n",
       "Q 18.3125 11.328125 20.140625 9.421875 \r\n",
       "Q 21.96875 7.515625 27.59375 7.515625 \r\n",
       "L 36.8125 7.515625 \r\n",
       "L 36.8125 0 \r\n",
       "L 27.59375 0 \r\n",
       "Q 17.1875 0 13.234375 3.875 \r\n",
       "Q 9.28125 7.765625 9.28125 18.015625 \r\n",
       "L 9.28125 47.703125 \r\n",
       "L 2.6875 47.703125 \r\n",
       "L 2.6875 54.6875 \r\n",
       "L 9.28125 54.6875 \r\n",
       "L 9.28125 70.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-116\"/>\r\n",
       "    </defs>\r\n",
       "    <g transform=\"translate(120.251875 16.318125)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-84\"/>\r\n",
       "     <use x=\"46.333984\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "     <use x=\"87.447266\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"148.726562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"176.509766\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"239.888672\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"267.671875\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"331.050781\" xlink:href=\"#DejaVuSans-103\"/>\r\n",
       "     <use x=\"394.527344\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"426.314453\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"487.59375\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"550.972656\" xlink:href=\"#DejaVuSans-100\"/>\r\n",
       "     <use x=\"614.449219\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"646.236328\" xlink:href=\"#DejaVuSans-118\"/>\r\n",
       "     <use x=\"705.416016\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"766.695312\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"794.478516\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"822.261719\" xlink:href=\"#DejaVuSans-100\"/>\r\n",
       "     <use x=\"885.738281\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"947.017578\" xlink:href=\"#DejaVuSans-116\"/>\r\n",
       "     <use x=\"986.226562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     <use x=\"1014.009766\" xlink:href=\"#DejaVuSans-111\"/>\r\n",
       "     <use x=\"1075.191406\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "     <use x=\"1138.570312\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"1170.357422\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"1231.636719\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "     <use x=\"1286.617188\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "     <use x=\"1341.597656\" xlink:href=\"#DejaVuSans-117\"/>\r\n",
       "     <use x=\"1404.976562\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "     <use x=\"1446.089844\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"1507.369141\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "     <use x=\"1562.349609\" xlink:href=\"#DejaVuSans-121\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"legend_1\">\r\n",
       "    <g id=\"patch_7\">\r\n",
       "     <path d=\"M 57.14375 60.230625 \r\n",
       "L 162.5375 60.230625 \r\n",
       "Q 164.5375 60.230625 164.5375 58.230625 \r\n",
       "L 164.5375 29.318125 \r\n",
       "Q 164.5375 27.318125 162.5375 27.318125 \r\n",
       "L 57.14375 27.318125 \r\n",
       "Q 55.14375 27.318125 55.14375 29.318125 \r\n",
       "L 55.14375 58.230625 \r\n",
       "Q 55.14375 60.230625 57.14375 60.230625 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_17\">\r\n",
       "     <path d=\"M 59.14375 35.416562 \r\n",
       "L 79.14375 35.416562 \r\n",
       "\" style=\"fill:none;stroke:#0000ff;stroke-dasharray:5.55,2.4;stroke-dashoffset:0;stroke-width:1.5;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_18\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"69.14375\" xlink:href=\"#m9063306cf0\" y=\"35.416562\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_18\">\r\n",
       "     <!-- train_accuracy -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 50.984375 -16.609375 \r\n",
       "L 50.984375 -23.578125 \r\n",
       "L -0.984375 -23.578125 \r\n",
       "L -0.984375 -16.609375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-95\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(87.14375 38.916562)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-116\"/>\r\n",
       "      <use x=\"39.208984\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"80.322266\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"141.601562\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "      <use x=\"169.384766\" xlink:href=\"#DejaVuSans-110\"/>\r\n",
       "      <use x=\"232.763672\" xlink:href=\"#DejaVuSans-95\"/>\r\n",
       "      <use x=\"282.763672\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"344.042969\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"399.023438\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"454.003906\" xlink:href=\"#DejaVuSans-117\"/>\r\n",
       "      <use x=\"517.382812\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"558.496094\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"619.775391\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"674.755859\" xlink:href=\"#DejaVuSans-121\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_19\">\r\n",
       "     <path d=\"M 59.14375 50.372812 \r\n",
       "L 79.14375 50.372812 \r\n",
       "\" style=\"fill:none;stroke:#ff0000;stroke-linecap:square;stroke-width:1.5;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"line2d_20\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"69.14375\" xlink:href=\"#m44ec9f35c7\" y=\"50.372812\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_19\">\r\n",
       "     <!-- val_accuracy -->\r\n",
       "     <g transform=\"translate(87.14375 53.872812)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-118\"/>\r\n",
       "      <use x=\"59.179688\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"120.458984\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "      <use x=\"148.242188\" xlink:href=\"#DejaVuSans-95\"/>\r\n",
       "      <use x=\"198.242188\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"259.521484\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"314.501953\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"369.482422\" xlink:href=\"#DejaVuSans-117\"/>\r\n",
       "      <use x=\"432.861328\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"473.974609\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "      <use x=\"535.253906\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"590.234375\" xlink:href=\"#DejaVuSans-121\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       " </g>\r\n",
       " <defs>\r\n",
       "  <clipPath id=\"pbe5c6a8780\">\r\n",
       "   <rect height=\"217.44\" width=\"334.8\" x=\"50.14375\" y=\"22.318125\"/>\r\n",
       "  </clipPath>\r\n",
       " </defs>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_metric(dfhistory,\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 五，使用模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.1129],\n",
       "        [0.6804],\n",
       "        [0.4140],\n",
       "        [0.9624],\n",
       "        [0.6321],\n",
       "        [0.9202],\n",
       "        [0.1844],\n",
       "        [0.8969],\n",
       "        [0.6387],\n",
       "        [0.1334]])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#预测概率\n",
    "y_pred_probs = net(torch.tensor(x_test[0:10]).float()).data\n",
    "y_pred_probs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "tensor([[0.0119],\n",
    "        [0.6029],\n",
    "        [0.2970],\n",
    "        [0.5717],\n",
    "        [0.5034],\n",
    "        [0.8655],\n",
    "        [0.0572],\n",
    "        [0.9182],\n",
    "        [0.5038],\n",
    "        [0.1739]])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.],\n",
       "        [1.],\n",
       "        [0.],\n",
       "        [1.],\n",
       "        [1.],\n",
       "        [1.],\n",
       "        [0.],\n",
       "        [1.],\n",
       "        [1.],\n",
       "        [0.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#预测类别\n",
    "y_pred = torch.where(y_pred_probs>0.5,\n",
    "        torch.ones_like(y_pred_probs),torch.zeros_like(y_pred_probs))\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "tensor([[0.],\n",
    "        [1.],\n",
    "        [0.],\n",
    "        [1.],\n",
    "        [1.],\n",
    "        [1.],\n",
    "        [0.],\n",
    "        [1.],\n",
    "        [1.],\n",
    "        [0.]])\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 六，保存模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pytorch 有两种保存模型的方式，都是通过调用pickle序列化方法实现的。\n",
    "\n",
    "第一种方法只保存模型参数。\n",
    "\n",
    "第二种方法保存完整模型。\n",
    "\n",
    "推荐使用第一种，第二种方法可能在切换设备和目录的时候出现各种问题。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**1，保存模型参数(推荐)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "odict_keys(['linear1.weight', 'linear1.bias', 'linear2.weight', 'linear2.bias', 'linear3.weight', 'linear3.bias'])\n"
     ]
    }
   ],
   "source": [
    "print(net.state_dict().keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.1129],\n",
       "        [0.6804],\n",
       "        [0.4140],\n",
       "        [0.9624],\n",
       "        [0.6321],\n",
       "        [0.9202],\n",
       "        [0.1844],\n",
       "        [0.8969],\n",
       "        [0.6387],\n",
       "        [0.1334]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 保存模型参数\n",
    "\n",
    "torch.save(net.state_dict(), \"./data/net_parameter.pkl\")\n",
    "\n",
    "net_clone = create_net()\n",
    "net_clone.load_state_dict(torch.load(\"./data/net_parameter.pkl\"))\n",
    "\n",
    "net_clone.forward(torch.tensor(x_test[0:10]).float()).data\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**2，保存完整模型(不推荐)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.1129],\n",
       "        [0.6804],\n",
       "        [0.4140],\n",
       "        [0.9624],\n",
       "        [0.6321],\n",
       "        [0.9202],\n",
       "        [0.1844],\n",
       "        [0.8969],\n",
       "        [0.6387],\n",
       "        [0.1334]])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.save(net, './data/net_model.pkl')\n",
    "net_loaded = torch.load('./data/net_model.pkl')\n",
    "net_loaded(torch.tensor(x_test[0:10]).float()).data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1-2,图片数据建模流程范例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import datetime\n",
    "\n",
    "#打印时间\n",
    "def printbar():\n",
    "    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "    print(\"\\n\"+\"==========\"*8 + \"%s\"%nowtime)\n",
    "\n",
    "#mac系统上pytorch和matplotlib在jupyter中同时跑需要更改环境变量\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\" "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一，准备数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cifar2数据集为cifar10数据集的子集，只包括前两种类别airplane和automobile。\n",
    "\n",
    "训练集有airplane和automobile图片各5000张，测试集有airplane和automobile图片各1000张。\n",
    "\n",
    "cifar2任务的目标是训练一个模型来对飞机airplane和机动车automobile两种图片进行分类。\n",
    "\n",
    "我们准备的Cifar2数据集的文件结构如下所示。\n",
    "\n",
    "![](./data/cifar2.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在Pytorch中构建图片数据管道通常有三种方法。\n",
    "\n",
    "第一种是使用 torchvision中的datasets.ImageFolder来读取图片然后用 DataLoader来并行加载。\n",
    "\n",
    "第二种是通过继承 torch.utils.data.Dataset 实现用户自定义读取逻辑然后用 DataLoader来并行加载。\n",
    "\n",
    "第三种方法是读取用户自定义数据集的通用方法，既可以读取图片数据集，也可以读取文本数据集。\n",
    "\n",
    "本篇我们介绍第一种方法。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch \n",
    "from torch import nn\n",
    "from torch.utils.data import Dataset,DataLoader\n",
    "from torchvision import transforms,datasets "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "transform_train = transforms.Compose(\n",
    "    [transforms.ToTensor()])\n",
    "transform_valid = transforms.Compose(\n",
    "    [transforms.ToTensor()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'0_airplane': 0, '1_automobile': 1}\n"
     ]
    }
   ],
   "source": [
    "ds_train = datasets.ImageFolder(\"./data/cifar2/train/\",\n",
    "            transform = transform_train,target_transform= lambda t:torch.tensor([t]).float())\n",
    "ds_valid = datasets.ImageFolder(\"./data/cifar2/test/\",\n",
    "            transform = transform_valid,target_transform= lambda t:torch.tensor([t]).float())\n",
    "\n",
    "print(ds_train.class_to_idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "dl_train = DataLoader(ds_train,batch_size = 50,shuffle = True,num_workers=3)\n",
    "dl_valid = DataLoader(ds_valid,batch_size = 50,shuffle = True,num_workers=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n",
       "<svg height=\"467.898125pt\" version=\"1.1\" viewBox=\"0 0 460.911765 467.898125\" width=\"460.911765pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       " <metadata>\r\n",
       "  <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\r\n",
       "   <cc:Work>\r\n",
       "    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\r\n",
       "    <dc:date>2020-12-08T13:48:52.925525</dc:date>\r\n",
       "    <dc:format>image/svg+xml</dc:format>\r\n",
       "    <dc:creator>\r\n",
       "     <cc:Agent>\r\n",
       "      <dc:title>Matplotlib v3.3.2, https://matplotlib.org/</dc:title>\r\n",
       "     </cc:Agent>\r\n",
       "    </dc:creator>\r\n",
       "   </cc:Work>\r\n",
       "  </rdf:RDF>\r\n",
       " </metadata>\r\n",
       " <defs>\r\n",
       "  <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\r\n",
       " </defs>\r\n",
       " <g id=\"figure_1\">\r\n",
       "  <g id=\"patch_1\">\r\n",
       "   <path d=\"M 0 467.898125 \r\n",
       "L 460.911765 467.898125 \r\n",
       "L 460.911765 0 \r\n",
       "L 0 0 \r\n",
       "z\r\n",
       "\" style=\"fill:none;\"/>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_1\">\r\n",
       "   <g id=\"patch_2\">\r\n",
       "    <path d=\"M 10.7 150.224007 \r\n",
       "L 138.605882 150.224007 \r\n",
       "L 138.605882 22.318125 \r\n",
       "L 10.7 22.318125 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p123822bd4c)\">\r\n",
       "    <image height=\"128\" id=\"imagef4caf43f6c\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"10.7\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-22.224007\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_1\"/>\r\n",
       "   <g id=\"matplotlib.axis_2\"/>\r\n",
       "   <g id=\"patch_3\">\r\n",
       "    <path d=\"M 10.7 150.224007 \r\n",
       "L 10.7 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_4\">\r\n",
       "    <path d=\"M 138.605882 150.224007 \r\n",
       "L 138.605882 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_5\">\r\n",
       "    <path d=\"M 10.7 150.224007 \r\n",
       "L 138.605882 150.224007 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_6\">\r\n",
       "    <path d=\"M 10.7 22.318125 \r\n",
       "L 138.605882 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_1\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(47.482316 16.318125)scale(0.12 -0.12)\">\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-108\"/>\r\n",
       "      <path d=\"M 34.28125 27.484375 \r\n",
       "Q 23.390625 27.484375 19.1875 25 \r\n",
       "Q 14.984375 22.515625 14.984375 16.5 \r\n",
       "Q 14.984375 11.71875 18.140625 8.90625 \r\n",
       "Q 21.296875 6.109375 26.703125 6.109375 \r\n",
       "Q 34.1875 6.109375 38.703125 11.40625 \r\n",
       "Q 43.21875 16.703125 43.21875 25.484375 \r\n",
       "L 43.21875 27.484375 \r\n",
       "z\r\n",
       "M 52.203125 31.203125 \r\n",
       "L 52.203125 0 \r\n",
       "L 43.21875 0 \r\n",
       "L 43.21875 8.296875 \r\n",
       "Q 40.140625 3.328125 35.546875 0.953125 \r\n",
       "Q 30.953125 -1.421875 24.3125 -1.421875 \r\n",
       "Q 15.921875 -1.421875 10.953125 3.296875 \r\n",
       "Q 6 8.015625 6 15.921875 \r\n",
       "Q 6 25.140625 12.171875 29.828125 \r\n",
       "Q 18.359375 34.515625 30.609375 34.515625 \r\n",
       "L 43.21875 34.515625 \r\n",
       "L 43.21875 35.40625 \r\n",
       "Q 43.21875 41.609375 39.140625 45 \r\n",
       "Q 35.0625 48.390625 27.6875 48.390625 \r\n",
       "Q 23 48.390625 18.546875 47.265625 \r\n",
       "Q 14.109375 46.140625 10.015625 43.890625 \r\n",
       "L 10.015625 52.203125 \r\n",
       "Q 14.9375 54.109375 19.578125 55.046875 \r\n",
       "Q 24.21875 56 28.609375 56 \r\n",
       "Q 40.484375 56 46.34375 49.84375 \r\n",
       "Q 52.203125 43.703125 52.203125 31.203125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-97\"/>\r\n",
       "      <path d=\"M 48.6875 27.296875 \r\n",
       "Q 48.6875 37.203125 44.609375 42.84375 \r\n",
       "Q 40.53125 48.484375 33.40625 48.484375 \r\n",
       "Q 26.265625 48.484375 22.1875 42.84375 \r\n",
       "Q 18.109375 37.203125 18.109375 27.296875 \r\n",
       "Q 18.109375 17.390625 22.1875 11.75 \r\n",
       "Q 26.265625 6.109375 33.40625 6.109375 \r\n",
       "Q 40.53125 6.109375 44.609375 11.75 \r\n",
       "Q 48.6875 17.390625 48.6875 27.296875 \r\n",
       "z\r\n",
       "M 18.109375 46.390625 \r\n",
       "Q 20.953125 51.265625 25.265625 53.625 \r\n",
       "Q 29.59375 56 35.59375 56 \r\n",
       "Q 45.5625 56 51.78125 48.09375 \r\n",
       "Q 58.015625 40.1875 58.015625 27.296875 \r\n",
       "Q 58.015625 14.40625 51.78125 6.484375 \r\n",
       "Q 45.5625 -1.421875 35.59375 -1.421875 \r\n",
       "Q 29.59375 -1.421875 25.265625 0.953125 \r\n",
       "Q 20.953125 3.328125 18.109375 8.203125 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 75.984375 \r\n",
       "L 18.109375 75.984375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-98\"/>\r\n",
       "      <path d=\"M 56.203125 29.59375 \r\n",
       "L 56.203125 25.203125 \r\n",
       "L 14.890625 25.203125 \r\n",
       "Q 15.484375 15.921875 20.484375 11.0625 \r\n",
       "Q 25.484375 6.203125 34.421875 6.203125 \r\n",
       "Q 39.59375 6.203125 44.453125 7.46875 \r\n",
       "Q 49.3125 8.734375 54.109375 11.28125 \r\n",
       "L 54.109375 2.78125 \r\n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \r\n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \r\n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \r\n",
       "Q 5.515625 13.8125 5.515625 26.8125 \r\n",
       "Q 5.515625 40.234375 12.765625 48.109375 \r\n",
       "Q 20.015625 56 32.328125 56 \r\n",
       "Q 43.359375 56 49.78125 48.890625 \r\n",
       "Q 56.203125 41.796875 56.203125 29.59375 \r\n",
       "z\r\n",
       "M 47.21875 32.234375 \r\n",
       "Q 47.125 39.59375 43.09375 43.984375 \r\n",
       "Q 39.0625 48.390625 32.421875 48.390625 \r\n",
       "Q 24.90625 48.390625 20.390625 44.140625 \r\n",
       "Q 15.875 39.890625 15.1875 32.171875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-101\"/>\r\n",
       "      <path id=\"DejaVuSans-32\"/>\r\n",
       "      <path d=\"M 10.59375 45.40625 \r\n",
       "L 73.1875 45.40625 \r\n",
       "L 73.1875 37.203125 \r\n",
       "L 10.59375 37.203125 \r\n",
       "z\r\n",
       "M 10.59375 25.484375 \r\n",
       "L 73.1875 25.484375 \r\n",
       "L 73.1875 17.1875 \r\n",
       "L 10.59375 17.1875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-61\"/>\r\n",
       "      <path d=\"M 31.78125 66.40625 \r\n",
       "Q 24.171875 66.40625 20.328125 58.90625 \r\n",
       "Q 16.5 51.421875 16.5 36.375 \r\n",
       "Q 16.5 21.390625 20.328125 13.890625 \r\n",
       "Q 24.171875 6.390625 31.78125 6.390625 \r\n",
       "Q 39.453125 6.390625 43.28125 13.890625 \r\n",
       "Q 47.125 21.390625 47.125 36.375 \r\n",
       "Q 47.125 51.421875 43.28125 58.90625 \r\n",
       "Q 39.453125 66.40625 31.78125 66.40625 \r\n",
       "z\r\n",
       "M 31.78125 74.21875 \r\n",
       "Q 44.046875 74.21875 50.515625 64.515625 \r\n",
       "Q 56.984375 54.828125 56.984375 36.375 \r\n",
       "Q 56.984375 17.96875 50.515625 8.265625 \r\n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \r\n",
       "Q 6.59375 17.96875 6.59375 36.375 \r\n",
       "Q 6.59375 54.828125 13.0625 64.515625 \r\n",
       "Q 19.53125 74.21875 31.78125 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-48\"/>\r\n",
       "     </defs>\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_2\">\r\n",
       "   <g id=\"patch_7\">\r\n",
       "    <path d=\"M 168.252941 150.224007 \r\n",
       "L 296.158824 150.224007 \r\n",
       "L 296.158824 22.318125 \r\n",
       "L 168.252941 22.318125 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#pcdc0d13047)\">\r\n",
       "    <image height=\"128\" id=\"image31c1ba4654\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"168.252941\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-22.224007\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_3\"/>\r\n",
       "   <g id=\"matplotlib.axis_4\"/>\r\n",
       "   <g id=\"patch_8\">\r\n",
       "    <path d=\"M 168.252941 150.224007 \r\n",
       "L 168.252941 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_9\">\r\n",
       "    <path d=\"M 296.158824 150.224007 \r\n",
       "L 296.158824 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_10\">\r\n",
       "    <path d=\"M 168.252941 150.224007 \r\n",
       "L 296.158824 150.224007 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_11\">\r\n",
       "    <path d=\"M 168.252941 22.318125 \r\n",
       "L 296.158824 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_2\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(205.035257 16.318125)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_3\">\r\n",
       "   <g id=\"patch_12\">\r\n",
       "    <path d=\"M 325.805882 150.224007 \r\n",
       "L 453.711765 150.224007 \r\n",
       "L 453.711765 22.318125 \r\n",
       "L 325.805882 22.318125 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#pd3aa41cb9f)\">\r\n",
       "    <image height=\"128\" id=\"image266b317f72\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"325.805882\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-22.224007\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_5\"/>\r\n",
       "   <g id=\"matplotlib.axis_6\"/>\r\n",
       "   <g id=\"patch_13\">\r\n",
       "    <path d=\"M 325.805882 150.224007 \r\n",
       "L 325.805882 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_14\">\r\n",
       "    <path d=\"M 453.711765 150.224007 \r\n",
       "L 453.711765 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_15\">\r\n",
       "    <path d=\"M 325.805882 150.224007 \r\n",
       "L 453.711765 150.224007 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_16\">\r\n",
       "    <path d=\"M 325.805882 22.318125 \r\n",
       "L 453.711765 22.318125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_3\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(362.588199 16.318125)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_4\">\r\n",
       "   <g id=\"patch_17\">\r\n",
       "    <path d=\"M 10.7 303.711066 \r\n",
       "L 138.605882 303.711066 \r\n",
       "L 138.605882 175.805184 \r\n",
       "L 10.7 175.805184 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p2500bfd64a)\">\r\n",
       "    <image height=\"128\" id=\"image937fbec105\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"10.7\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-175.711066\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_7\"/>\r\n",
       "   <g id=\"matplotlib.axis_8\"/>\r\n",
       "   <g id=\"patch_18\">\r\n",
       "    <path d=\"M 10.7 303.711066 \r\n",
       "L 10.7 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_19\">\r\n",
       "    <path d=\"M 138.605882 303.711066 \r\n",
       "L 138.605882 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_20\">\r\n",
       "    <path d=\"M 10.7 303.711066 \r\n",
       "L 138.605882 303.711066 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_21\">\r\n",
       "    <path d=\"M 10.7 175.805184 \r\n",
       "L 138.605882 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_4\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(47.482316 169.805184)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_5\">\r\n",
       "   <g id=\"patch_22\">\r\n",
       "    <path d=\"M 168.252941 303.711066 \r\n",
       "L 296.158824 303.711066 \r\n",
       "L 296.158824 175.805184 \r\n",
       "L 168.252941 175.805184 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p120b5e6a30)\">\r\n",
       "    <image height=\"128\" id=\"imagecb58561074\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"168.252941\" xlink:href=\"data:image/png;base64,\r\n",
       "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAMxElEQVR4nO2dyW4c1xWGa7g9sic2JU6SKErREMtW4jheBMjSWSRAgLxEXiIv4WfIJm8hZJEnEBIYsWXJgiGKEiWRapI9VXcN2fL/yukCwWR1z787rOrqW9WH9Z/5hn/58x+K4AKiKAoEWa5ilokcBaHIdVcTOY5VznO9Xr1eFzmMYpFnyVzk+XKh58e63kWK9RYqt1otXc/kBMebIvN5zJOpyMtE11OvO5Hbbb1eE/ebpqnIYajPM471ecShrofrKwr5OUvg8ei/nGfwBKYAnsMUwHM4ciI5iJwfgvMK2gigoDxTjuP1ZvNErw9Op82QgQPDSNfL81N8/zzR76vhf6AIYsj4HwkdRHBqrSGyq+vzjRt6PKrr8whyvR45O4Oc5nr/od7+T0DPtzeA5zAF8BymAJ7DTabqZ1f5lekCfiuOw20NgmI1Ry8WalMsYFPw/AhfkMe4Pig1oI0Q6Ql5Ac7X2wuiWO9vmev5jDPEhdoIWaR+fx6rDUAbKg91AbRhCthQeemGgQI2U2g2gOECTAE8hymA53AzxNYdOBYUF+TgINoIccmPVc5h7Ns55czp+FTkJAXHMU7BBSKO0G63Ra5l+n1BhFxFBs6kDZTR79bPJ7l+vpbq84xgcyyX5HS9fgGboshX22jk+ICi2QCGizAF8BymAJ7DrXX68odSHAB+eIJYerpYiryEjZAhbrBc6vlws4PT85l+Hhxfb6ofPUccIXLg3Dr8+ELPrznUI6Srg+mMS5CD5wgkZKF+3xKcTpuI9RXk7JC5iAg2QEUuweoBDAJTAM9hCuA5XIJYtKPjSE6KlIOiGo/z4+REPWF0ei7yxzOVa+D82toarqc2B2sCi6naFAniHjHjAOD40tMI6aev9sObTa0JbDe1PqBW0+9nSaZjDWC82kbgevI8XXnc3gCewxTAc5gCeA43Oh/LH8hJ9Rixc+hMFNAmQCwcNgNr6pbFmcgz+PUB/HTWwM1Qo8iavwg1h5PJRK9fVX+AGkHW6VeBfRKswVyDTUO/voY+CdoIsVvdJ8DzGWewN4DnMAXwHKYAnsOF8IMpF7QBcvaewQ8FZ7JiLcX5zZZyYIEauiUaDeaJ5hJGyB3M51rj6Op6P+eICzQytSFKNgBsGNpIIfsI2JtXYy+lwpGzA9Qf4LiDjVXH/bUaq2042jD2BvAcpgCewxTAc7jxRDmx11MOmY2VU1nH7uCnst+fNX9nY431Z6iR29rZFfnN4VuR26hzd/CzZ4nWFO5cuybyGDZAd01rBhm7L80vwP/MfKpxhmZTr3dwcCDy7vaOyOs9rceIndpIi4U+/xZyI5uben9pyriIzjPo9Toi2xvAc5gCeA5TAM/hXv74Wv6Qpj+KzJk25PRsiV421ADSb15fXxf57FRzEf31gcg7N26K3MPxSYKaw+xY5BBxhY1r2yJfbypn3r1zL1CgTwAlgynqD8ZjvZ8CfQ3vDt+IfAs2z2DQE7nV1PUzsgITLCgKfd4bQ71ep6txF3sDeA5TAM9hCuA53GSifiL91naDfrHKw4Fy+nA4FDmZYf5AqJzW7nRFZi/hFH62q3Mun66ns6aclyGXMJvp9dZ3dL17e3siz+f6fQnmKXS76senS7UJPv/llyK/+P65yMtS34Ry/HCgnO1QgzlP1OYIUUPYQG6AfR32BvAcpgCewxTAc7hU0+tBHGmsudtVjj8/11g+/eBebyDy0eSdyCcnI5HrmJv37kj9+INDjVM0Ebt3iDNwnkDs1MZJUE8wmSrHH7490u9raA3fx5Hev6trbL2zpjbNz+4/FPn6lvr93/zzX1iPXv/9ieY2OmvojcQsZcfyDdQXzOf6POwN4DlMATyHKYDncPQ7t7Y0X/340acij0YjkSfoKxh9VA5jPp918ZzjR510scYNZogLLDPN74eoedvE/Tx48HP9tuV7Xe+7jyLfv7+p62no8zqFDXE+U85e5j+IPBxq/n6OmT/vT/R5Ho9U7vb0+SUL5fQw0LhCv69xkVrNagINF2AK4DlMATyHmyFWn8KPzlADeO+u5stZh394oH476+oZu2cdfht+NOXJHH0AC9oEnF2scYJ+X+MaMXoV3xxqHIAcn8fKwW+PlfPHZ7q+757r87hz547Iz56/Ejks9PlvbGiuodEZiBxnup4FagDTUO+/gfkE9gbwHKYAnsMUwHM41vjF6N07PtbY/HCwIXILvX1r4OydHfXDw1D90FKvHXrhFqVkha63g3z8DDYB4xSvXysnP/5cY/UfTpVDj050fsGtW7dFTlIHWc/nvP4F+iA2tm6ovKE2SquNmsxIbaZGA/MLkAvIcn0eQWAzggwXYArgOUwBPId79FBj41ubytmdjua7G+gTGGOuH2fUkDO5b2DJBoGMMEEwQa8c6wE4A4jzANZhw9x98EDkte5ArzfWz3/1u9+LPJ0ox354PxKZfQTcI4lxkGZDn+/zF9+K/O3334k8WNffZ2dXcw0F5jkkid6PvQE8hymA5zAF8Bzh377+q5BEhnn3w42ByAcH2jv49388EXlrSzloras1fIN1zU9zOv+7Dxp3GPS1bn+EXsIpYvW39+6K3F9Xzu900CvXV87t9fQ4cx20Mdpd5WDiyRN9Prz+zb1bInMeQWk/AtT106bi+dOpxjXOzjROYW8Az2EK4DlMATyH29tXP30yUb8+4GjcmL1nWqfeaK2esUPOZ368v66cTxtgOlPOn8APH/SV84uQs3Z1/bPZbOVxgvfDXAbn8O3uah/A/v6+yJ8+/mzl93E/gAxxA3I6azZpE7Am094AnsMUwHOYAngON0Fv2QI1aTn617mP3wL7159P1U9utNVG6A00f39t87qe39K4AfP9AfLpSaLfX68px3EbQNYj9Id6Pv1q7nNY2jcwWr1nD2ci3X+ouYebN3UGEvv3S3sKwcY4OtIaRto0tNE4/8DeAJ7DFMBzmAJ4DreEZ56iZoy9e8Nt7ZXb2tX6gcVSOajWUg7axvlbOzq3rzdArDtFPnsOmyQDB2O9Lcw4Yg1jVuh66UdPYSPRzyfns76BcQXuEUS/vDTPP15dQ8ncwsaGxkFoA/T72Cs6MHgNUwDPYQrgOdzautbxH7zW/vjJRPPvn3yidfR/3P6TyKw5c8gd3LihNgD93hC9fGenup4P70+wPtS9ow6/h3n8nCP47xffiMw+CHIy5yCSw7tdfZ6n5xqrf/VKewGZC2GNY1VugjYA91ou7W3sbD6A4QJMATyHKYDncPfA6aOJ9rsfvD0UuYU9Z3796AuRC+xX//Klzsj5cKIzecanypGDgXLsGDV4tBno57aa6mdvbm6J3GxoruGr/a9E5hxE7iFEP5r5eu5T+PTpU5GZS5ih5pB+PnMTpX0Naxp3GLQHIjOXwZpGewN4DlMAz2EK4Dnc7p7G9n/T/K2e0NIauCHy93X4nUmiHHU+U8754aX2Ffzis8cic55Ao04O1rjEtQ3NJWyjt3EbuYYcM4SipnI45/fX6mi4R6pkjLp7xg2ePXsm8vGJxjHI+bRpIuQ2lqW9jbH3MMYuNmCTBIHtGWS4AFMAz2EK4DncCHsHb2xqDdsXX/5K5OFwIHKIoTRNxJrvPdA4Qxe9efu3tS+h19Xji4X6wWmu+w90e8ppvYHG4gNSOIoEk7len359wFHGkNknUIfNcAs1eA3EFejnp6naIHGJwxXsXWScgDZJjLiBvQE8hymA5zAF8BzhjAnjSsAPrTgelroBFQ5XSDEXMJmrnMImIBoOvYrY8yfCvntplV9d8S/CGUYLxN4ZiyfncwZTDhuj6ucpLnk+YW8Az2EK4DlMATyHo5tbjXCF9FPHOWBg9fmxU7+60cAeQg41bqA87g8Q8Q4pwu9nGKAK2Kq33MsHI4I2QMbkQgWFX5Xzeb69ATyHKYDnMAXwHOGiRCKXDAvwgpVnIFZd+sRqnby8zbIaGeoDKm2CSy6AT5d+fp6vft7c+7d8/av9XvYG8BymAJ7DFMBzhOlVSaQCVRpWVHBceEXWr7p+vjq1UIlS/QC/Hw+AZ9MEoJ9ful7Fz3XZXIK9ATyHKYDnMAXwHGFxRRvgf21AVHF21XIrORkszP+AUlSkJF+Og6viClxt1fPkcVZbXPb3sDeA5zAF8BymAJ4jLPK0gnQvpyNlP7bCsa3ye8Fq2SVtgLCCFaMr/g9cMYzwf/++KpvA3gCewxTAc5gCeA5XciRLnMwTKvL1FcFsHq7yg5kLiCr9fMzzX3n21XFZP77ycVdcryxbPYDhCjAF8BymAJ7DlYPdFZ9gIT4Bki/VseP0LCtt6gMRF6jq1aMNgPujnGfat1CO3a+WGfsnSt+HJ1CZu+Dnr1gvQNgbwHOYAngOUwDP8R8ky6l1PmiPGAAAAABJRU5ErkJggg==\" y=\"-175.711066\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_9\"/>\r\n",
       "   <g id=\"matplotlib.axis_10\"/>\r\n",
       "   <g id=\"patch_23\">\r\n",
       "    <path d=\"M 168.252941 303.711066 \r\n",
       "L 168.252941 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_24\">\r\n",
       "    <path d=\"M 296.158824 303.711066 \r\n",
       "L 296.158824 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_25\">\r\n",
       "    <path d=\"M 168.252941 303.711066 \r\n",
       "L 296.158824 303.711066 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_26\">\r\n",
       "    <path d=\"M 168.252941 175.805184 \r\n",
       "L 296.158824 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_5\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(205.035257 169.805184)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_6\">\r\n",
       "   <g id=\"patch_27\">\r\n",
       "    <path d=\"M 325.805882 303.711066 \r\n",
       "L 453.711765 303.711066 \r\n",
       "L 453.711765 175.805184 \r\n",
       "L 325.805882 175.805184 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p0f87f6fe54)\">\r\n",
       "    <image height=\"128\" id=\"image8ee6b7ad5a\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"325.805882\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-175.711066\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_11\"/>\r\n",
       "   <g id=\"matplotlib.axis_12\"/>\r\n",
       "   <g id=\"patch_28\">\r\n",
       "    <path d=\"M 325.805882 303.711066 \r\n",
       "L 325.805882 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_29\">\r\n",
       "    <path d=\"M 453.711765 303.711066 \r\n",
       "L 453.711765 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_30\">\r\n",
       "    <path d=\"M 325.805882 303.711066 \r\n",
       "L 453.711765 303.711066 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_31\">\r\n",
       "    <path d=\"M 325.805882 175.805184 \r\n",
       "L 453.711765 175.805184 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_6\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(362.588199 169.805184)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_7\">\r\n",
       "   <g id=\"patch_32\">\r\n",
       "    <path d=\"M 10.7 457.198125 \r\n",
       "L 138.605882 457.198125 \r\n",
       "L 138.605882 329.292243 \r\n",
       "L 10.7 329.292243 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p74c0f18332)\">\r\n",
       "    <image height=\"128\" id=\"image9dd4252e60\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"10.7\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-329.198125\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_13\"/>\r\n",
       "   <g id=\"matplotlib.axis_14\"/>\r\n",
       "   <g id=\"patch_33\">\r\n",
       "    <path d=\"M 10.7 457.198125 \r\n",
       "L 10.7 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_34\">\r\n",
       "    <path d=\"M 138.605882 457.198125 \r\n",
       "L 138.605882 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_35\">\r\n",
       "    <path d=\"M 10.7 457.198125 \r\n",
       "L 138.605882 457.198125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_36\">\r\n",
       "    <path d=\"M 10.7 329.292243 \r\n",
       "L 138.605882 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_7\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(47.482316 323.292243)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_8\">\r\n",
       "   <g id=\"patch_37\">\r\n",
       "    <path d=\"M 168.252941 457.198125 \r\n",
       "L 296.158824 457.198125 \r\n",
       "L 296.158824 329.292243 \r\n",
       "L 168.252941 329.292243 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p8efdf19424)\">\r\n",
       "    <image height=\"128\" id=\"image23511e5791\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"168.252941\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-329.198125\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_15\"/>\r\n",
       "   <g id=\"matplotlib.axis_16\"/>\r\n",
       "   <g id=\"patch_38\">\r\n",
       "    <path d=\"M 168.252941 457.198125 \r\n",
       "L 168.252941 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_39\">\r\n",
       "    <path d=\"M 296.158824 457.198125 \r\n",
       "L 296.158824 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_40\">\r\n",
       "    <path d=\"M 168.252941 457.198125 \r\n",
       "L 296.158824 457.198125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_41\">\r\n",
       "    <path d=\"M 168.252941 329.292243 \r\n",
       "L 296.158824 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_8\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(205.035257 323.292243)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_9\">\r\n",
       "   <g id=\"patch_42\">\r\n",
       "    <path d=\"M 325.805882 457.198125 \r\n",
       "L 453.711765 457.198125 \r\n",
       "L 453.711765 329.292243 \r\n",
       "L 325.805882 329.292243 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g clip-path=\"url(#p46a7d93ac1)\">\r\n",
       "    <image height=\"128\" id=\"image0049fa37b2\" transform=\"scale(1 -1)translate(0 -128)\" width=\"128\" x=\"325.805882\" xlink:href=\"data:image/png;base64,\r\n",
       "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\" y=\"-329.198125\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_17\"/>\r\n",
       "   <g id=\"matplotlib.axis_18\"/>\r\n",
       "   <g id=\"patch_43\">\r\n",
       "    <path d=\"M 325.805882 457.198125 \r\n",
       "L 325.805882 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_44\">\r\n",
       "    <path d=\"M 453.711765 457.198125 \r\n",
       "L 453.711765 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_45\">\r\n",
       "    <path d=\"M 325.805882 457.198125 \r\n",
       "L 453.711765 457.198125 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_46\">\r\n",
       "    <path d=\"M 325.805882 329.292243 \r\n",
       "L 453.711765 329.292243 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"text_9\">\r\n",
       "    <!-- label = 0 -->\r\n",
       "    <g transform=\"translate(362.588199 323.292243)scale(0.12 -0.12)\">\r\n",
       "     <use xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"27.783203\" xlink:href=\"#DejaVuSans-97\"/>\r\n",
       "     <use x=\"89.0625\" xlink:href=\"#DejaVuSans-98\"/>\r\n",
       "     <use x=\"152.539062\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "     <use x=\"214.0625\" xlink:href=\"#DejaVuSans-108\"/>\r\n",
       "     <use x=\"241.845703\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"273.632812\" xlink:href=\"#DejaVuSans-61\"/>\r\n",
       "     <use x=\"357.421875\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "     <use x=\"389.208984\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       " </g>\r\n",
       " <defs>\r\n",
       "  <clipPath id=\"p123822bd4c\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"10.7\" y=\"22.318125\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"pcdc0d13047\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"168.252941\" y=\"22.318125\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"pd3aa41cb9f\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"325.805882\" y=\"22.318125\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p2500bfd64a\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"10.7\" y=\"175.805184\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p120b5e6a30\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"168.252941\" y=\"175.805184\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p0f87f6fe54\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"325.805882\" y=\"175.805184\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p74c0f18332\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"10.7\" y=\"329.292243\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p8efdf19424\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"168.252941\" y=\"329.292243\"/>\r\n",
       "  </clipPath>\r\n",
       "  <clipPath id=\"p46a7d93ac1\">\r\n",
       "   <rect height=\"127.905882\" width=\"127.905882\" x=\"325.805882\" y=\"329.292243\"/>\r\n",
       "  </clipPath>\r\n",
       " </defs>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<Figure size 576x576 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "\n",
    "#查看部分样本\n",
    "from matplotlib import pyplot as plt \n",
    "\n",
    "plt.figure(figsize=(8,8)) \n",
    "for i in range(9):\n",
    "    img,label = ds_train[i]\n",
    "    img = img.permute(1,2,0)\n",
    "    ax=plt.subplot(3,3,i+1)\n",
    "    ax.imshow(img.numpy())\n",
    "    ax.set_title(\"label = %d\"%label.item())\n",
    "    ax.set_xticks([])\n",
    "    ax.set_yticks([]) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "ename": "PicklingError",
     "evalue": "Can't pickle <function <lambda> at 0x000001F099E5A8B0>: attribute lookup <lambda> on __main__ failed",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mPicklingError\u001b[0m                             Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-a3c7fde6f0df>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# Pytorch的图片默认顺序是 Batch,Channel,Width,Height\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mdl_train\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      3\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m     \u001b[1;32mbreak\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m__iter__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    350\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_iterator\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    351\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 352\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_iterator\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    353\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    354\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m_get_iterator\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    292\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0m_SingleProcessDataLoaderIter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    293\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 294\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0m_MultiProcessingDataLoaderIter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    295\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    296\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, loader)\u001b[0m\n\u001b[0;32m    799\u001b[0m             \u001b[1;31m#     before it starts, and __del__ tries to join but will get:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    800\u001b[0m             \u001b[1;31m#     AssertionError: can only join a started process.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 801\u001b[1;33m             \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstart\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    802\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_index_queues\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindex_queue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    803\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_workers\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\process.py\u001b[0m in \u001b[0;36mstart\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    119\u001b[0m                \u001b[1;34m'daemonic processes are not allowed to have children'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    120\u001b[0m         \u001b[0m_cleanup\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 121\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_popen\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    122\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_sentinel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_popen\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msentinel\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m         \u001b[1;31m# Avoid a refcycle if the target function holds an indirect\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\context.py\u001b[0m in \u001b[0;36m_Popen\u001b[1;34m(process_obj)\u001b[0m\n\u001b[0;32m    222\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    223\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 224\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0m_default_context\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProcess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    225\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    226\u001b[0m \u001b[1;32mclass\u001b[0m \u001b[0mDefaultContext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseContext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\context.py\u001b[0m in \u001b[0;36m_Popen\u001b[1;34m(process_obj)\u001b[0m\n\u001b[0;32m    325\u001b[0m         \u001b[1;32mdef\u001b[0m \u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    326\u001b[0m             \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mpopen_spawn_win32\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPopen\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 327\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mPopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    328\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    329\u001b[0m     \u001b[1;32mclass\u001b[0m \u001b[0mSpawnContext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseContext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\popen_spawn_win32.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, process_obj)\u001b[0m\n\u001b[0;32m     91\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     92\u001b[0m                 \u001b[0mreduction\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprep_data\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mto_child\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 93\u001b[1;33m                 \u001b[0mreduction\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mto_child\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     94\u001b[0m             \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     95\u001b[0m                 \u001b[0mset_spawning_popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\reduction.py\u001b[0m in \u001b[0;36mdump\u001b[1;34m(obj, file, protocol)\u001b[0m\n\u001b[0;32m     58\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     59\u001b[0m     \u001b[1;34m'''Replacement for pickle.dump() using ForkingPickler.'''\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 60\u001b[1;33m     \u001b[0mForkingPickler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     61\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     62\u001b[0m \u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mPicklingError\u001b[0m: Can't pickle <function <lambda> at 0x000001F099E5A8B0>: attribute lookup <lambda> on __main__ failed"
     ]
    }
   ],
   "source": [
    "# Pytorch的图片默认顺序是 Batch,Channel,Width,Height\n",
    "for x,y in dl_train:\n",
    "    print(x.shape,y.shape) \n",
    "    break    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二，定义模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用Pytorch通常有三种方式构建模型：\n",
    "- 使用nn.Sequential按层顺序构建模型，\n",
    "- 继承nn.Module基类构建自定义模型，\n",
    "- 继承nn.Module基类构建模型并辅助应用模型容器(nn.Sequential,nn.ModuleList,nn.ModuleDict)进行封装。\n",
    "\n",
    "此处选择通过继承nn.Module基类构建自定义模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([10, 8, 1, 1])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#测试AdaptiveMaxPool2d的效果\n",
    "pool = nn.AdaptiveMaxPool2d((1,1))\n",
    "t = torch.randn(10,8,32,32)\n",
    "pool(t).shape "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "torch.Size([10, 8, 1, 1])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Net(\n",
      "  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1))\n",
      "  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  (conv2): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n",
      "  (dropout): Dropout2d(p=0.1, inplace=False)\n",
      "  (adaptive_pool): AdaptiveMaxPool2d(output_size=(1, 1))\n",
      "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
      "  (linear1): Linear(in_features=64, out_features=32, bias=True)\n",
      "  (relu): ReLU()\n",
      "  (linear2): Linear(in_features=32, out_features=1, bias=True)\n",
      "  (sigmoid): Sigmoid()\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "class Net(nn.Module):\n",
    "    \n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(in_channels=3,out_channels=32,kernel_size = 3)\n",
    "        self.pool = nn.MaxPool2d(kernel_size = 2,stride = 2)\n",
    "        self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size = 5)\n",
    "        self.dropout = nn.Dropout2d(p = 0.1)\n",
    "        self.adaptive_pool = nn.AdaptiveMaxPool2d((1,1))\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.linear1 = nn.Linear(64,32)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.linear2 = nn.Linear(32,1)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "        \n",
    "    def forward(self,x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.pool(x)\n",
    "        x = self.conv2(x)\n",
    "        x = self.pool(x)\n",
    "        x = self.dropout(x)\n",
    "        x = self.adaptive_pool(x)\n",
    "        x = self.flatten(x)\n",
    "        x = self.linear1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.linear2(x)\n",
    "        y = self.sigmoid(x)\n",
    "        return y\n",
    "        \n",
    "net = Net()\n",
    "print(net)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1           [-1, 32, 30, 30]             896\n",
      "         MaxPool2d-2           [-1, 32, 15, 15]               0\n",
      "            Conv2d-3           [-1, 64, 11, 11]          51,264\n",
      "         MaxPool2d-4             [-1, 64, 5, 5]               0\n",
      "         Dropout2d-5             [-1, 64, 5, 5]               0\n",
      " AdaptiveMaxPool2d-6             [-1, 64, 1, 1]               0\n",
      "           Flatten-7                   [-1, 64]               0\n",
      "            Linear-8                   [-1, 32]           2,080\n",
      "              ReLU-9                   [-1, 32]               0\n",
      "           Linear-10                    [-1, 1]              33\n",
      "          Sigmoid-11                    [-1, 1]               0\n",
      "================================================================\n",
      "Total params: 54,273\n",
      "Trainable params: 54,273\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.011719\n",
      "Forward/backward pass size (MB): 0.359634\n",
      "Params size (MB): 0.207035\n",
      "Estimated Total Size (MB): 0.578388\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "import torchkeras\n",
    "torchkeras.summary(net,input_shape= (3,32,32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三，训练模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pytorch通常需要用户编写自定义训练循环，训练循环的代码风格因人而异。\n",
    "\n",
    "有3类典型的训练循环代码风格：\n",
    "- 脚本形式训练循环，\n",
    "- 函数形式训练循环，\n",
    "- 类形式训练循环。\n",
    "\n",
    "此处介绍一种较通用的函数形式训练循环。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "model = net\n",
    "model.optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)\n",
    "model.loss_func = torch.nn.BCELoss()\n",
    "model.metric_func = lambda y_pred,y_true: roc_auc_score(y_true.data.numpy(),y_pred.data.numpy())\n",
    "model.metric_name = \"auc\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "ename": "PicklingError",
     "evalue": "Can't pickle <function <lambda> at 0x000001F099E5A8B0>: attribute lookup <lambda> on __main__ failed",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mPicklingError\u001b[0m                             Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-13-033e94274189>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     33\u001b[0m \u001b[1;31m# 测试train_step效果\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 34\u001b[1;33m \u001b[0mfeatures\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlabels\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdl_train\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     35\u001b[0m \u001b[0mtrain_step\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlabels\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m__iter__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    350\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_iterator\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    351\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 352\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_iterator\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    353\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    354\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m_get_iterator\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    292\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0m_SingleProcessDataLoaderIter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    293\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 294\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0m_MultiProcessingDataLoaderIter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    295\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    296\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, loader)\u001b[0m\n\u001b[0;32m    799\u001b[0m             \u001b[1;31m#     before it starts, and __del__ tries to join but will get:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    800\u001b[0m             \u001b[1;31m#     AssertionError: can only join a started process.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 801\u001b[1;33m             \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstart\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    802\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_index_queues\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindex_queue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    803\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_workers\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\process.py\u001b[0m in \u001b[0;36mstart\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    119\u001b[0m                \u001b[1;34m'daemonic processes are not allowed to have children'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    120\u001b[0m         \u001b[0m_cleanup\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 121\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_popen\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    122\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_sentinel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_popen\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msentinel\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    123\u001b[0m         \u001b[1;31m# Avoid a refcycle if the target function holds an indirect\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\context.py\u001b[0m in \u001b[0;36m_Popen\u001b[1;34m(process_obj)\u001b[0m\n\u001b[0;32m    222\u001b[0m     \u001b[1;33m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    223\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 224\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0m_default_context\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProcess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    225\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    226\u001b[0m \u001b[1;32mclass\u001b[0m \u001b[0mDefaultContext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseContext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\context.py\u001b[0m in \u001b[0;36m_Popen\u001b[1;34m(process_obj)\u001b[0m\n\u001b[0;32m    325\u001b[0m         \u001b[1;32mdef\u001b[0m \u001b[0m_Popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    326\u001b[0m             \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mpopen_spawn_win32\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPopen\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 327\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mPopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    328\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    329\u001b[0m     \u001b[1;32mclass\u001b[0m \u001b[0mSpawnContext\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mBaseContext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\popen_spawn_win32.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, process_obj)\u001b[0m\n\u001b[0;32m     91\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     92\u001b[0m                 \u001b[0mreduction\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprep_data\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mto_child\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 93\u001b[1;33m                 \u001b[0mreduction\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprocess_obj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mto_child\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     94\u001b[0m             \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     95\u001b[0m                 \u001b[0mset_spawning_popen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\multiprocessing\\reduction.py\u001b[0m in \u001b[0;36mdump\u001b[1;34m(obj, file, protocol)\u001b[0m\n\u001b[0;32m     58\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     59\u001b[0m     \u001b[1;34m'''Replacement for pickle.dump() using ForkingPickler.'''\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 60\u001b[1;33m     \u001b[0mForkingPickler\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     61\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     62\u001b[0m \u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mPicklingError\u001b[0m: Can't pickle <function <lambda> at 0x000001F099E5A8B0>: attribute lookup <lambda> on __main__ failed"
     ]
    }
   ],
   "source": [
    "def train_step(model,features,labels):\n",
    "    \n",
    "    # 训练模式，dropout层发生作用\n",
    "    model.train()\n",
    "    \n",
    "    # 梯度清零\n",
    "    model.optimizer.zero_grad()\n",
    "    \n",
    "    # 正向传播求损失\n",
    "    predictions = model(features)\n",
    "    loss = model.loss_func(predictions,labels)\n",
    "    metric = model.metric_func(predictions,labels)\n",
    "\n",
    "    # 反向传播求梯度\n",
    "    loss.backward()\n",
    "    model.optimizer.step()\n",
    "\n",
    "    return loss.item(),metric.item()\n",
    "\n",
    "def valid_step(model,features,labels):\n",
    "    \n",
    "    # 预测模式，dropout层不发生作用\n",
    "    model.eval()\n",
    "    # 关闭梯度计算\n",
    "    with torch.no_grad():\n",
    "        predictions = model(features)\n",
    "        loss = model.loss_func(predictions,labels)\n",
    "        metric = model.metric_func(predictions,labels)\n",
    "    \n",
    "    return loss.item(), metric.item()\n",
    "\n",
    "\n",
    "# 测试train_step效果\n",
    "features,labels = next(iter(dl_train))\n",
    "train_step(model,features,labels)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "(0.6922046542167664, 0.5088566827697262)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_model(model,epochs,dl_train,dl_valid,log_step_freq):\n",
    "\n",
    "    metric_name = model.metric_name\n",
    "    dfhistory = pd.DataFrame(columns = [\"epoch\",\"loss\",metric_name,\"val_loss\",\"val_\"+metric_name]) \n",
    "    print(\"Start Training...\")\n",
    "    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "    print(\"==========\"*8 + \"%s\"%nowtime)\n",
    "\n",
    "    for epoch in range(1,epochs+1):  \n",
    "\n",
    "        # 1，训练循环-------------------------------------------------\n",
    "        loss_sum = 0.0\n",
    "        metric_sum = 0.0\n",
    "        step = 1\n",
    "\n",
    "        for step, (features,labels) in enumerate(dl_train, 1):\n",
    "\n",
    "            loss,metric = train_step(model,features,labels)\n",
    "\n",
    "            # 打印batch级别日志\n",
    "            loss_sum += loss\n",
    "            metric_sum += metric\n",
    "            if step%log_step_freq == 0:   \n",
    "                print((\"[step = %d] loss: %.3f, \"+metric_name+\": %.3f\") %\n",
    "                      (step, loss_sum/step, metric_sum/step))\n",
    "\n",
    "        # 2，验证循环-------------------------------------------------\n",
    "        val_loss_sum = 0.0\n",
    "        val_metric_sum = 0.0\n",
    "        val_step = 1\n",
    "\n",
    "        for val_step, (features,labels) in enumerate(dl_valid, 1):\n",
    "\n",
    "            val_loss,val_metric = valid_step(model,features,labels)\n",
    "\n",
    "            val_loss_sum += val_loss\n",
    "            val_metric_sum += val_metric\n",
    "\n",
    "        # 3，记录日志-------------------------------------------------\n",
    "        info = (epoch, loss_sum/step, metric_sum/step, \n",
    "                val_loss_sum/val_step, val_metric_sum/val_step)\n",
    "        dfhistory.loc[epoch-1] = info\n",
    "\n",
    "        # 打印epoch级别日志\n",
    "        print((\"\\nEPOCH = %d, loss = %.3f,\"+ metric_name + \\\n",
    "              \"  = %.3f, val_loss = %.3f, \"+\"val_\"+ metric_name+\" = %.3f\") \n",
    "              %info)\n",
    "        nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n",
    "        print(\"\\n\"+\"==========\"*8 + \"%s\"%nowtime)\n",
    "\n",
    "    print('Finished Training...')\n",
    "    \n",
    "    return dfhistory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "epochs = 20\n",
    "\n",
    "dfhistory = train_model(model,epochs,dl_train,dl_valid,log_step_freq = 50)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Start Training...\n",
    "================================================================================2020-06-28 20:47:56\n",
    "[step = 50] loss: 0.691, auc: 0.627\n",
    "[step = 100] loss: 0.690, auc: 0.673\n",
    "[step = 150] loss: 0.688, auc: 0.699\n",
    "[step = 200] loss: 0.686, auc: 0.716\n",
    "\n",
    "EPOCH = 1, loss = 0.686,auc  = 0.716, val_loss = 0.678, val_auc = 0.806\n",
    "\n",
    "================================================================================2020-06-28 20:48:18\n",
    "[step = 50] loss: 0.677, auc: 0.780\n",
    "[step = 100] loss: 0.675, auc: 0.775\n",
    "[step = 150] loss: 0.672, auc: 0.782\n",
    "[step = 200] loss: 0.669, auc: 0.779\n",
    "\n",
    "EPOCH = 2, loss = 0.669,auc  = 0.779, val_loss = 0.651, val_auc = 0.815\n",
    "\n",
    "......\n",
    "\n",
    "================================================================================2020-06-28 20:54:24\n",
    "[step = 50] loss: 0.386, auc: 0.914\n",
    "[step = 100] loss: 0.392, auc: 0.913\n",
    "[step = 150] loss: 0.395, auc: 0.911\n",
    "[step = 200] loss: 0.398, auc: 0.911\n",
    "\n",
    "EPOCH = 19, loss = 0.398,auc  = 0.911, val_loss = 0.449, val_auc = 0.924\n",
    "\n",
    "================================================================================2020-06-28 20:54:43\n",
    "[step = 50] loss: 0.416, auc: 0.917\n",
    "[step = 100] loss: 0.417, auc: 0.916\n",
    "[step = 150] loss: 0.404, auc: 0.918\n",
    "[step = 200] loss: 0.402, auc: 0.918\n",
    "\n",
    "EPOCH = 20, loss = 0.402,auc  = 0.918, val_loss = 0.535, val_auc = 0.925\n",
    "\n",
    "================================================================================2020-06-28 20:55:03\n",
    "Finished Training...\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 四，评估模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dfhistory "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./data/1-2-dfhistory.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'svg'\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_metric(dfhistory, metric):\n",
    "    train_metrics = dfhistory[metric]\n",
    "    val_metrics = dfhistory['val_'+metric]\n",
    "    epochs = range(1, len(train_metrics) + 1)\n",
    "    plt.plot(epochs, train_metrics, 'bo--')\n",
    "    plt.plot(epochs, val_metrics, 'ro-')\n",
    "    plt.title('Training and validation '+ metric)\n",
    "    plt.xlabel(\"Epochs\")\n",
    "    plt.ylabel(metric)\n",
    "    plt.legend([\"train_\"+metric, 'val_'+metric])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_metric(dfhistory,\"loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./data/1-2-loss曲线.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_metric(dfhistory,\"auc\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./data/1-2-auc曲线.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 五，使用模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(model,dl):\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        result = torch.cat([model.forward(t[0]) for t in dl])\n",
    "    return(result.data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#预测概率\n",
    "y_pred_probs = predict(model,dl_valid)\n",
    "y_pred_probs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "tensor([[8.4032e-01],\n",
    "        [1.0407e-02],\n",
    "        [5.4146e-04],\n",
    "        ...,\n",
    "        [1.4471e-02],\n",
    "        [1.7673e-02],\n",
    "        [4.5081e-01]])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#预测类别\n",
    "y_pred = torch.where(y_pred_probs>0.5,\n",
    "        torch.ones_like(y_pred_probs),torch.zeros_like(y_pred_probs))\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "tensor([[1.],\n",
    "        [0.],\n",
    "        [0.],\n",
    "        ...,\n",
    "        [0.],\n",
    "        [0.],\n",
    "        [0.]])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 六，保存模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "推荐使用保存参数方式保存Pytorch模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(model.state_dict().keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "odict_keys(['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'linear1.weight', 'linear1.bias', 'linear2.weight', 'linear2.bias'])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存模型参数\n",
    "\n",
    "torch.save(model.state_dict(), \"./data/model_parameter.pkl\")\n",
    "\n",
    "net_clone = Net()\n",
    "net_clone.load_state_dict(torch.load(\"./data/model_parameter.pkl\"))\n",
    "\n",
    "predict(net_clone,dl_valid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "tensor([[0.0204],\n",
    "        [0.7692],\n",
    "        [0.4967],\n",
    "        ...,\n",
    "        [0.6078],\n",
    "        [0.7182],\n",
    "        [0.8251]])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果对本书内容理解上有需要进一步和作者交流的地方，欢迎在公众号\"Python与算法之美\"下留言。作者时间和精力有限，会酌情予以回复。\n",
    "\n",
    "也可以在公众号后台回复关键字：**加群**，加入读者交流群和大家讨论。\n",
    "\n",
    "![image.png](./data/Python与算法之美logo.jpg)"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "notebook_metadata_filter": "-all",
   "text_representation": {
    "extension": ".md",
    "format_name": "markdown"
   }
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
